質問
Docbookセクションノードをトラバースしようとしています。構造は次のとおりです。
<sect1>
<sect2>
<sect3>
<sect4>
<sect5>
</sect5>
</sect4>
</sect3>
</sect2>
</sect1>
したがって、sect1には内部にsect2のみがあり、sect2には内部にsect3しかありません。ノード内に複数のサブノードを持つこともできます。たとえば、sect1内の複数のsect2。
プログラム的に、ループがどのセクションにあるかを追跡するためにカウンターを使用して再帰的に繰り返します。
今回は、XSLTを使用してループする必要があります。したがって、同等の方法、またはXSLTでこれを行うより良い方法はありますか?
編集:Willieが提案したコードと同様のコードが既にあり、すべてのセクトノード(sect1からsect5)を指定しています。私はそれがセクトノードを単独で決定するループするソリューションを探していて、コードを繰り返す必要はありません。 Docbookの仕様では最大5つのネストされたノードのみが許可されることを認識しています。
解決
コメントの1つで言うように、{x}に関係なく、すべてのsect {x}ノードに対して同じ処理を実行している場合、以下で十分です:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match=
"sect1|sect2|sect3|sect4|sect5">
<!-- Some processing here -->
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
本当に同じ方法で処理する必要がある場合、<!> quot; sect <!> quot; {x}(xは[1、100]の範囲にあるとします)という形式の異なる名前を持つ要素をさらに多く処理します。 、次を使用できます:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match=
"*[starts-with(name(), 'sect')
and
substring-after(name(), 'sect') >= 1
and
not(substring-after(name(), 'sect') > 101)
]">
<!-- Some processing here -->
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
他のヒント
<xsl:template match="sect1">
<!-- Do stuff -->
<xsl:apply-templates />
</xsl:template>
<xsl:template match="sect2">
<!-- Do stuff -->
<xsl:apply-templates />
</xsl:template>
<xsl:template match="sect3">
<!-- Do stuff -->
<xsl:apply-templates />
</xsl:template>
<xsl:template match="sect4">
<!-- Do stuff -->
<xsl:apply-templates />
</xsl:template>
<xsl:template match="sect5">
<!-- Do stuff -->
<xsl:apply-templates />
</xsl:template>
所属していません StackOverflow