XML Editor
Sign up for a WebBoard account Sign Up Keyword Search Search More Options... Options
Chat Rooms Chat Help Help News News Log in to WebBoard Log in Not Logged in
Show tree view Topic
Topic Page 1 2 3 4 5 6 7 8 9 Go to previous topicPrev TopicGo to next topicNext Topic
Postnext
Everett TSubject: Recursive XML transformation
Author: Everett T
Date: 28 Jan 2006 01:55 PM
I am having a problem displaying recursive XML in the same order that it is listed in the XML file. My problem occurs within the "section" template. When I apply the templates for the child tags ("subtitle", "line", "subtotal", "total") and recursively apply the template for the "section" tag it displays them in the order that <apply-templates> tags are listed. I'm not sure what I can do to force it to generate the HTML in the same order that it is in the XML file. I should also mention that the tag order in the example XML below isn't necessarily in the order that it will always appear.

Any help would be appreciated!


My XML looks something like this:
<summary>
<section format="2" title="BALANCE FORWARD">
<subtotal>
<description>PREVIOUS BALANCE</description>
<amount>$140.24</amount>
</subtotal>
</section>
<section format="2">
<subtotal>
<description>TOTAL BALANCE FORWARD</description>
<amount>$140.24</amount>
</subtotal>
</section>
<section format="2" title="ACCOUNT ACTIVITY"/>
<section format="2">
<line>
<description>LOCAL SERVICE</description>
<amount>(11/01/2005-11/30/05)</amount>
</line>
<section format="2">
<subtotal>
<description>Additional Services</description>
<amount>$8.15</amount>
</subtotal>
<section format="2">
<line>
<description>Touch Call</description>
<amount>$1.65</amount>
</line>
</section>
<section format="2">
<line>
<description>Inter Acc Chrg Sgl Ln</description>
<amount>$6.50</amount>
</line>
</section>
</section>
</section>
<summary>

My XSL file looks likes this:
<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" omit-xml-declaration="yes" indent="yes" />

<xsl:template match="summary">
<xsl:apply-templates select="section" />
</xsl:template>

<xsl:template match="section">
<xsl:variable name="rowformat" select="@format" />
<xsl:if test="@title">
<table width="100%" border="0">
<tr>
<td class="title"><xsl:value-of select="@title" /></td>
</tr>
</table>
</xsl:if>

<xsl:apply-templates select="section" />
<xsl:apply-templates select="subtitle" />
<xsl:apply-templates select="line">
<xsl:with-param name="rowformat" select="$rowformat" />
</xsl:apply-templates>
<xsl:apply-templates select="subtotal" />
<xsl:apply-templates select="total" />
</xsl:template>

<xsl:template match="line">
<xsl:param name="rowformat" />
<table width="100%" border="0">
<xsl:attribute name="class">
<xsl:text>format</xsl:text>
<xsl:value-of select="$rowformat" />
</xsl:attribute>
<tr>
<xsl:if test="$rowformat = '2'">
<td><xsl:value-of select="description" /></td>
<td align="right"><xsl:value-of select="amount" /></td>
</xsl:if>
</tr>
</table>
</xsl:template>

<xsl:template match="subtitle">
<table width="100%" border="0" class="subtitle">
<tr>
<td><xsl:value-of select="description" /></td>
<td align="right"><xsl:value-of select="datarange" /></td>
</tr>
</table>
</xsl:template>

<xsl:template match="subtotal">
<table width="100%" border="0" class="subtotal">
<tr>
<td><xsl:value-of select="description" /></td>
<td align="right"><xsl:value-of select="amount" /></td>
</tr>
</table>
</xsl:template>

<xsl:template match="total">
<table width="100%" border="0" class="total">
<tr>
<td><xsl:value-of select="description" /></td>
<td align="right"><xsl:value-of select="amount" /></td>
</tr>
</table>
</xsl:template>

</xsl:stylesheet>

Postnext
Tony LavinioSubject: Recursive XML transformation
Author: Tony Lavinio
Date: 30 Jan 2006 10:21 AM
We're not quite sure what you want, since you didn't give a sample of
the output, but you can use an 'or' in the apply-templates using the
vertical-bar '|' character. So if you were to combine some of your
calls together, they'd get processed in the order they appear in the
source file:

<xsl:apply-templates select="section|subtitle|line|subtotal">
<xsl:with-param name="rowformat" select="$rowformat"/>
</xsl:apply-templates>

Since rowformat isn't used by some of the templates but is by others,
we can pass it without harm.

Postnext
Everett TSubject: Recursive XML transformation
Author: Everett T
Date: 30 Jan 2006 11:50 AM
Thank you Tony. That is what I was looking for.
At the moment, my stylesheet is generating a new table everytime is comes across a title attribute or a line, subtitle, subtotal or total tag. For instance, when it runs across a subtitle tag followed by a line tag the output would look something like the following:
<table>
<tr>
<td>
description tag inner text
</td>
<td>
daterange tag inner text
</td>
</tr>
</table>
<table>
<tr>
<td>
description tag inner text
</td>
<td>
amount tag inner text
</td>
</tr>
</table>

My ultimate goal is to be able to use the section tag to start a new table and each title attribute and subtitle, line, subtotal, and total tags would be a row within the table. Thus, having an entire section fall within a single table.

>We're not quite sure what you
>want, since you didn't give a
>sample of
>the output, but you can use an
>'or' in the apply-templates
>using the
>vertical-bar '|' character.
>So if you were to combine some
>of your
>calls together, they'd get
>processed in the order they
>appear in the
>source file:
>
><xsl:apply-templates
>select="section|subtitle|line|
>subtotal">
><xsl:with-param
>name="rowformat"
>select="$rowformat"/>
></xsl:apply-templates>
>
>Since rowformat isn't used by
>some of the templates but is
>by others,
>we can pass it without harm.

Posttop
Tony LavinioSubject: Recursive XML transformation
Author: Tony Lavinio
Date: 30 Jan 2006 01:57 PM
Just make <table> the first thing in your 'section' template, and put
</table> right at the end.
Then get rid of <table> on the other templates that ae called from
the 'section' template.
You'll end up with only one pair of matching <table></table> tags in
your whole .xsl file, and it should be what you described.

 
Topic Page 1 2 3 4 5 6 7 8 9 Go to previous topicPrev TopicGo to next topicNext Topic
Download A Free Trial of Stylus Studio 6 XML Professional Edition Today! Powered by Stylus Studio, the world's leading XML IDE for XML, XSLT, XQuery, XML Schema, DTD, XPath, WSDL, XHTML, SQL/XML, and XML Mapping!  
go

Log In Options

Site Map | Privacy Policy | Terms of Use | Trademarks
Stylus Scoop XML Newsletter:
W3C Member
Stylus Studio® and DataDirect XQuery ™are from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2016 All Rights Reserved.