This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
different results with xalan and msxsl/saxon
- From: "Frank" <fweenink at ambrac dot nl>
- To: "XSL-List" <XSL-List at lists dot mulberrytech dot com>
- Date: Mon, 18 Feb 2002 10:46:29 +0100
- Subject: [xsl] different results with xalan and msxsl/saxon
- Reply-to: xsl-list at lists dot mulberrytech dot com
With following xml file I wanted to create a stylesheet to get
a nested structure. So with heading 2 as a child of heading 1, etc.
<file>
<p stylename="heading 1">1. title</p>
<p stylename="Body Text">body text</p>
<p stylename="Body Text">body text</p>
<p stylename="heading 2">1.1 title</p>
<p stylename="Body Text">body text</p>
<p stylename="Body Text">body text</p>
<p stylename="List Bullet">list item</p>
<p stylename="List Bullet">list item</p>
<p stylename="heading 3">1.1.1 title</p>
<p stylename="Body Text">body text</p>
<table>
<row>
<cell>
<p>text</p>
</cell>
</row>
</table>
<p stylename="Body Text">body text</p>
<p stylename="heading 2">1.2 title</p>
<p stylename="Body Text">body text</p>
<p stylename="Body Text">body text</p>
<p stylename="heading 1">2. title</p>
<p stylename="Body Text">body text</p>
<p stylename="Body Text">body text</p>
<p stylename="List Bullet">list item</p>
<p stylename="List Bullet">list item</p>
<p stylename="heading 2">2.1 title</p>
<p stylename="Body Text">body text</p>
</file>
So I made this stylesheet:
<!-- key for selecting the p and table elements between the headings -->
<xsl:key name="body-text" match="file/node()[not(starts-with(@stylename,
'heading')) or not(@stylename)]"
use="preceding-sibling::p[starts-with(@stylename, 'heading')][1]"/>
<!-- selecting the headings with one level higher than the preceding
heading -->
<xsl:key name="headings" match="file/p[starts-with(@stylename, 'heading')]"
use="preceding-sibling::p[starts-with(@stylename, 'heading')]
[substring(@stylename, 9 , 1)=substring(current()/@stylename, 9,
1)-1][1]"/>
<xsl:template match="file">
<xsl:copy>
<xsl:apply-templates select="p[starts-with(@stylename, 'heading 1')]"/>
</xsl:copy>
</xsl:template>
<!-- match all headings for recursiveness(is that good English?) -->
<xsl:template match="p[starts-with(@stylename, 'heading')]">
<xsl:variable name="level" select="substring(@stylename, 9, 1)"/>
<section>
<titel><xsl:apply-templates select="@stylename"/><xsl:value-of
select="."/></titel>
<body>
<xsl:for-each select="key('body-text', current())">
<xsl:apply-templates select="current()"/>
</xsl:for-each>
</body>
<xsl:for-each select="key('headings', current())">
<xsl:apply-templates select="current()"/>
</xsl:for-each>
</section>
</xsl:template>
<!-- copy -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
With xalan 2.2 D14 I got a good result, but with msxsl and saxon the
stylesheet
only selected heading 1.
xalan:
<section>
<titel stylename="heading 1">1. title</titel>
<body>
<p stylename="Body Text">body text</p>
<p stylename="Body Text">body text</p>
</body>
<section>
<titel stylename="heading 2">1.1 title</titel>
<body>
<p stylename="Body Text">body text</p>
<p stylename="Body Text">body text</p>
<p stylename="List Bullet">list item</p>
<p stylename="List Bullet">list item</p>
</body>
<section>
<titel stylename="heading 3">1.1.1 title</titel>
..................... etc.
msxsl, saxon:
<file>
<section>
<titel stylename="heading 1">1. title</titel>
<body>
<p stylename="Body Text">body text</p>
<p stylename="Body Text">body text</p>
</body>
</section>
<section>
<titel stylename="heading 1">2. title</titel>
<body>
<p stylename="Body Text">body text</p>
<p stylename="Body Text">body text</p>
<p stylename="List Bullet">list item</p>
<p stylename="List Bullet">list item</p>
</body>
</section>
</file>
Is xalan going rong here? And is there a better way to handle this?
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list