xsl-list
[Top] [All Lists]

RE: Re: [xsl] formatting issues

2006-11-02 10:30:44
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>
--~--