everyone . In this case ,I want to conpute the maxximun depth of the chapter.For instance, a book without chapters has height 0 . A book only has chapters with no sections ,the height should be 1.The folowing is xml:
<book title="D">
<author>
<name>abc</name>
</author>
<chapter title="chapter1">
<section title="section1.1"/>
<section title="section1.2">
<section title="section1.2.1"/>
<section title="section1.2.2"/>
</section>
<section title="section1.3">
<section title="section1.3.1"/>
</section>
</chapter>
<chapter title="chapter2"/>
</book>
By the way ,I used saxon. I want to try to use matching templates only.In this case ,the output is text ,and the result is
3
This is my XSL for computing each note's depth? Is it right?And then how can out put the maximum of the curren by call a template named max??
<xsl:transform version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:template match="/">
<xsl:apply-templates select="book"/>
<xsl:text> </xsl:text>
</xsl:template>
<xsl:template match="book">
<xsl:apply-templates select="chapter">
<xsl:with-param name ="depth" select ="1"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="chapter|section">
<xsl:param name="depth" as="item()*"/>
<xsl:variable name ="current" select ="$depth"/>
<xsl:sequence select ="$depth"/>
<xsl:if test ="not(empty(section))">
<xsl:apply-templates select="section">
<xsl:with-param name="depth" select="$depth+1"/>
</xsl:apply-templates>
</xsl:if>
</xsl:template>
</xsl:transform >
Use:
This can be made slightly more efficient:
And here is your solution -- corrected:
XSLT 1.0 solution:
when this transformation is applied on the provided XML document:
the wanted, correct answer is produced: