You need to parse the question a little more carefully.
=============================
"state" elements according to an earlier statement you made, are always and
only child elements of "states". That is to say all "state" elements are
siblings and their parent element is "states". Therefor the construct "//state"
is pointless and a waste of processing effort since it tells the processor to
find all "state" elements at whatever level they may be in the source document.
=============================
Are you saying that there may be "state" elements with "sym" child elements
that contain text nodes which can have any one of these values "R", "A", and
"C" and further that you want to process each type differently?
If so, you will want to create three templates:
<xsl:template match="state[sym='A']>
</xsl:template>
<xsl:template match="state[sym='C']>
</xsl:template>
<xsl:template match="state[sym='R']>
</xsl:template>
and inside each template, put the content you want each to output.
So at some point you will have a template like this:
<xsl:template match="states">
<xsl:apply-templates />
</xsl:template>
which will cause every "state" element to be processed by it's distinct
template.
=============================
Since you have shown in some detail what you want to output when you encounter
a "state" element with a "sym" child with a value of "R", let's consider what
that template would look like.
<xsl:template match="state[sym='R']>
<tr><td colspan="8"><b>STATES: </b></td></tr>
<tr>
<td width="9%"><u>Val1</u></td>
<td width="15%"><u>Val2</u></td>
<td width="7%"><u>Val3</u></td>
<td width="7%"><u>Val4</u></td>
<td width="9%"><u>Val5</u></td>
<td width="21%"><u>Val6</u></td>
<td width="15%"><u>Val7</u></td>
<td width="7%"><u>Val8</u></td>
<tr>
<td><xsl:value-of select="Val1"/></td>
<td><xsl:value-of select="Val2"/></td>
<td><xsl:value-of select="Val3"/></td>
<td><xsl:value-of select="Val4"/></td>
.... We'll deal with the dynamically-generated data here ....
</tr>
</tr>
</xsl:template>
On the subject of the dynamically-generated data, I'm going to suggest you put
it in a variable to make things easier for me to work with, so we are going to
modify the template above to this:
<xsl:template match="state[sym='R']>
<xsl:variable name="dyn-data" select="document(... whatever goes in here...)"
/>
<tr><td colspan="8"><b>STATES: </b></td></tr>
<tr>
<td width="9%"><u>Val1</u></td>
<td width="15%"><u>Val2</u></td>
<td width="7%"><u>Val3</u></td>
<td width="7%"><u>Val4</u></td>
<td width="9%"><u>Val5</u></td>
<td width="21%"><u>Val6</u></td>
<td width="15%"><u>Val7</u></td>
<td width="7%"><u>Val8</u></td>
<tr>
<td><xsl:value-of select="Val1"/></td>
<td><xsl:value-of select="Val2"/></td>
<td><xsl:value-of select="Val3"/></td>
<td><xsl:value-of select="Val4"/></td>
... Questions about dynamic data still to be answered ...
</tr>
</tr>
</xsl:template>
You showed a sample of the document that would be returned by the document()
function. It contained a root node of "results" that had two "data" child
nodes. You showed in your original stylesheet an intent to insert the content
of the dynamic document here. Each of the two "data" nodes had an identical set
of child nodes (Val5, Val6, Val7, Val8). Did you envision putting the values
from one or the other set of (Val5, Val6, Val7, Val8) in the row in the
template above, and if so, how would you distinguish which "data" node to use?
If you planned to use both (or all, if there are more than two "data" nodes")
do you intend to add additional columns to this row or to break the output into
several rows?
=============================
Let's have the answers to these questions before we go any further.
--
Charles Knell
cknell(_at_)onebox(_dot_)com - email
-----Original Message-----
From: ms <mina_hurray(_at_)yahoo(_dot_)com>
Sent: Thu, 2 Nov 2006 08:43:32 -0800 (PST)
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: Re: [xsl] formatting issues
Thank you very much for your interest and response.
Here is my response:
Your test tries to establish if there is any "sym"
element with a value of
"R" that is a child of a "state" element that my be
at any level in the
document. If so then it goes on to create a table.
Is that really what you want to do?
- Yes, the 'sym' element can have values R, A and C.
So depending on the value of sym, the heading for the
table changes. I have done a similar code for the
other values also.
From: cknell(_at_)onebox(_dot_)com
Reply-To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: RE: RE: Re: [xsl] formatting issues
Date: Thu, 02 Nov 2006 10:18:25 -0500
I'm willing to work with you on this, but the XSLT
you showed is such an
awful mess that in order for me to spend time on
the problem, we'll have to
clean it up no matter that "So hetting these to
display correctly on the
XSLT is not an issue."
Based on what I see in your stylesheet, I surmise
that you are fairly new
to XSLT, or at least, you haven't had the benefit
of training by someone
with a good understanding of the processing model.
So let's start with your first template. I'll quote
from the first part:
<xsl:template match="states">
<br/>
<xsl:if test="//state/sym='R'">
Your test tries to establish if there is any "sym"
element with a value of
"R" that is a child of a "state" element that my be
at any level in the
document. If so then it goes on to create a table.
Is that really what you want to do? Since you say
that all "state" elements
are children of one "states" element, there is no
point in starting the
test attribute value with two slashes. You could
accomplish the same thing,
with less confusion and at less processing cost by
replacing your construct
with this one, IF that's what you need to do.
<xsl:template match="states">
<br/>
<xsl:if test="state/sym='R'">
The next question concerns this:
<xsl:for-each select="//state">
<xsl:choose>
<xsl:when test="sym='R'">
Here again you are instructing the processor to
find all "state" elements
at whatever level they may be found in the source
document. As I said
earlier, it is rare that "xsl:for-each" is required
outside of a situation
where you need to sort elements in the output. And
you don't seem to be
sorting anything here. It is widely recognized that
people new to XSLT who
come from an imperative or procedural programming
background are usually
puzzled by the processing model and sieze on "for
each" as a familiar
landmark. While it usually does what you want it to
do, it is a false
friend in that it retards the process of absorbing
the XSLT processing
model.
So if what you want is for the stylesheet to
process those "state" elements
in your source document that have a "sym" child
with a value of "R", your
stylesheet should start like this:
<xsl:template match="states">
<xsl:apply-templates select="state[sym='R']" />
</xsl:template>
<xsl:template match="state">
<tr>
<td><xsl:value-of select="Val1"/></td>
<td><xsl:value-of select="Val2"/></td>
<td><xsl:value-of select="Val3"/></td>
<td><xsl:value-of select="Val4"/></td>
.... Code to deal with external document goes
here ....
</tr>
</xsl:template>
Do you want to do anything with "state" elements
that have no "sym" child
or have a "sym" child with a value other than "R",
or do you wish to omit
them from the output?
I'll continue when we both have an understanding of
what's really wanted.
Please advise.
--
Charles Knell
cknell(_at_)onebox(_dot_)com - email
-----Original Message-----
From: ms <mina_hurray(_at_)yahoo(_dot_)com>
Sent: Thu, 2 Nov 2006 06:33:02 -0800 (PST)
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: RE: Re: [xsl] formatting issues
Hello:
Thank you all for taking time to go through my
question.
Let me try to explain this.
I have an input file:
<states>
<state>
<sym>R<sym>
<Val1>text<Val1>
<Val2>text<Val2>
<Val3>text<Val3>
<Val4>text<Val4>
<state>
</states>
Now there can be any number of "state" child
elements
under "states". The children of "state" are Val1,
Val2, Val3, Val4. So hetting these to display
correctly on the XSLT is not an issue.
Next, we come to the <xsl:apply-templates
select="server/getinfo.dox.../>
This server call returns data in XML format which
is:
<results>
<data>
<Val5>something</Val5>
<Val6>something</Val6>
<Val7>something</Val7>
<Val8>P</Val8>
</data>
<data>
<Val5>something</Val5>
<Val6>something</Val6>
<Val7>something</Val7>
<Val8>P</Val8>
</data>
</results>
<data> can be any number inside <results>
The output should be like this. Consider the first
line the headers of the table:
VAL1 VAL2 VAL3 VAL4 VAL5 VAL6 VAL7 VAL8
Text
--- cknell(_at_)onebox(_dot_)com wrote:
I'll try to help, but first I need the answers
to
some questions.
The first template matches the element "states"
========================== > <xsl:template
match="states">
<br/>
<xsl:if test="//state/sym='R'">
... content omitted for clarity ...
</xsl:template>
========================== >
In your source XML document, is "states" the
parent
of all "state" elements, or do some "state"
elements
have "state" child elements?
Further along in this template you have this:
========================== > <xsl:for-each
select="//state">
========================== >
=== message truncated ==
____________________________________________________________________________________
Get your email and see which of your friends are online - Right on the New
Yahoo.com
(http://www.yahoo.com/preview)
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--