RE: Re: [xsl] formatting issues

Subject: RE: Re: [xsl] formatting issues
From: cknell@xxxxxxxxxx
Date: Thu, 02 Nov 2006 12:30:23 -0500
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@xxxxxxxxxx - email



-----Original Message-----
From:     ms <mina_hurray@xxxxxxxxx>
Sent:     Thu, 2 Nov 2006 08:43:32 -0800 (PST)
To:       xsl-list@xxxxxxxxxxxxxxxxxxxxxx
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@xxxxxxxxxx
> >Reply-To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> >To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> >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@xxxxxxxxxx - email
> >
> >
> >
> >-----Original Message-----
> >From:     ms <mina_hurray@xxxxxxxxx>
> >Sent:     Thu, 2 Nov 2006 06:33:02 -0800 (PST)
> >To:       xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> >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@xxxxxxxxxx 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) 

Current Thread
  • RE: Re: [xsl] formatting issues, (continued)
      • ms - Thu, 2 Nov 2006 06:33:02 -0800 (PST)
      • ms - Thu, 2 Nov 2006 06:35:51 -0800 (PST)
    • cknell - Thu, 02 Nov 2006 10:18:25 -0500
    • ms - Thu, 2 Nov 2006 08:43:32 -0800 (PST)
    • cknell - Thu, 02 Nov 2006 12:30:23 -0500 <=
      • ms - Fri, 3 Nov 2006 08:24:31 -0800 (PST)
    • cknell - Fri, 03 Nov 2006 15:12:03 -0500