章の最大深さを見つける
質問
みんな。この場合、章のMaxximunの深さを締めくくります。インスタンスのない本は、height 0を持ちます。本のみがセクションなしの章を持つ章を持っています、高さは1です。
<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>
.
ところで、私はサクソンを使用しました。マッチングテンプレートのみを使用しようとしたい。この場合は、出力はテキストで、結果はです。
3
.
各ノートの深さを計算するための私のXSLですか?それは正しいですか?それでは、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 >
. 解決
そしてここにあなたの解決策を修正しました:
.<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:variable name="vDepths" as="xs:integer*">
<xsl:apply-templates select="book"/>
</xsl:variable>
<xsl:sequence select="max($vDepths)"/>
</xsl:template>
<xsl:template match="book" as="xs:integer*">
<xsl:apply-templates select="chapter">
<xsl:with-param name ="depth" select ="1"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="chapter|section" as="xs:integer*">
<xsl:param name="depth" as="xs:integer"/>
<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 >
他のヒント
XSLT 1.0の解決策:
.
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:apply-templates select="//*[self::chapter or self::section]">
<xsl:sort data-type="number" order="descending" select=
"count(ancestor::*[self::chapter or self::section])
"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="chapter|section">
<xsl:if test="position()=1">
<xsl:value-of select=
"count(ancestor::*[self::chapter or self::section]) +1
"/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
提供された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>
望み、正解は生産されています:
.3
使用:
.
max(//(chapter|section)/count(ancestor::*[self::chapter or self::section]))+1
これはわずかに効率的にすることができます:
.max(//(chapter|section)[not(chapter or section)]
/count(ancestor::*[self::chapter or self::section])
) +1