|
Subject: RE: [xsl] Outputing tables on the fly (Was incrementing mid-stream part 4) - [Long: XML/XSL samples included] From: "Andreas L. Delmelle" <a_l.delmelle@xxxxxxxxxx> Date: Mon, 19 Apr 2004 22:10:20 +0200 |
> -----Original Message-----
> From: Durston, Andrew (AGRE)
>
Hi,
> The usual caveats about this probably being lousy code (haven't
> coded in years and new to XSL to boot). We are taking the XML
> file and generating HTML documents from it.
>
Well, based on your input XML and XSL code, let's try to devise an alternate
solution in order to demonstrate to you some features of XSLT --beware
though, may turn out to be lousy code anyway ;)
First things first... since all the objects you *do* want to process have to
have an objectnumber child that contains (or is it starts-with?) '1.2.2.',
you can easily filter those out with an XPath like so:
<xsl:for-each select="test-plan/doorsobject[
starts-with(objectnumber,'1.2.2.')]">
And, perhaps more importantly: stop thinking loops, start thinking
hierarchies. Your input XML seems a perfect example, so trade the
xsl:for-each for an xsl:apply-templates, and define templates where you put
the rest of the code:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<xsl:apply-templates select="test-plan/doorsobject[
starts-with(objectnumber,'1.2.2.')]" />
</html>
</xsl:template>
<xsl:template match="doorsobject[objectlevel=4]">
<!-- If object level 4, then test header -->
<h4>[Test case]
<xsl:value-of select="concat(objectnumber,' ')"/>
<xsl:value-of select="objectheading"/>
</h4>
</xsl:template>
<xsl:template match="doorsobject[objectlevel >= 5 and
tabletype='TableNone']">
<!-- If object level 5 or greater, and paragraph,
process like a paragraph -->
<p>[Starting point for Test cases]
<xsl:value-of select="objecttext"/>
</p>
</xsl:template>
<xsl:template match="doorsobject[objectlevel > 5 and
tabletype='TableCell' and
tablecell/tablecellrow=1 and
tablecell/tablecellcol=1]">
<!-- If object level 5 or greater, and a table entry,
and first table entry, then initiate table-creation -->
<p>Found a table beginning</p>
<table border="1">
<xsl:apply-templates select=". |
following-sibling::doorsobject[
starts-with(objectnumber,substring(
current()/objectnumber,1,6)) and
objectlevel = current()/objectlevel and
tabletype=current()/tabletype and
tablecell/tablecellcol=
current()/tablecell/tablecellcol]"
mode="table-row" />
</table>
<p>
<xsl:text>end of table starting at '</xsl:text>
<xsl:value-of select="objecttext"/>
<xsl:text>'</xsl:text>
</p>
</xsl:template>
<xsl:template match="doorsobject" mode="table-row">
<!-- a row -->
<tr>
<xsl:for-each select=". | following-sibling::doorsobject[
starts-with(objectnumber,substring(
current()/objectnumber,1,6)) and
objectlevel = current()/objectlevel and
tabletype=current()/tabletype and
tablecell/tablecellrow=
current()/tablecell/tablecellrow]">
<!-- a column -->
<td>
<xsl:copy-of select="objecttext"/>
</td>
</xsl:for-each>
</tr>
</xsl:template>
<xsl:template match="text()" />
</xsl:stylesheet>
AFAICT, the tablenumrows and tablenumcols nodes are negligeable quantities,
so I did neglect them...
Hope this helps!
Cheers,
Andreas
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| [xsl] Outputing tables on the fly (, Durston, Andrew (AGR | Thread | [xsl] Creating mailing labels - 3 c, Nishad Hassan |
| [xsl] problem with adding a waterma, David Beck | Date | [xsl] Compiler errors: already defi, Renganat Krishnan |
| Month |