質問

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>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top