2

ツリーの一部を含む select 属性に変数を持つテンプレートを適用します。そこから、次の兄弟:: 構造で別の適用テンプレートを呼び出しますが、すべてのツリーに適用されます。例えば:

<a>
    <b id="1" ol="1" />
    <b id="2" ol="0" />
    <b id="3" ol="0" />
    <b id="4" ol="1" />
    <b id="5" ol="0" />
    <b id="6" ol="0" />
    <b id="7" ol="1" />
    <b id="8" ol="0" />
    <b id="9" ol="0" />
    <b id="10" ol="1" />
    <b id="11" ol="0" />
    <b id="12" ol="0" />
    <b id="13" ol="1" />
    <b id="14" ol="0" />
    <b id="15" ol="0" />
    <b id="16" ol="1" />
</a>

...
<xsl:variable name="part" select="b[@ol = 1] />
<xsl:apply-templates mode="top" select="$part[position() mod 3 = 1]" />
...
<xsl:template mode="top" match="*">
    <tr>
        <xsl:apply-template mode="inner" select=".|following-sibling::b[not(position() > 2)]" />
    </tr>
<xsl:template>

<xsl:template mode="inner" match="*">
    <p><xsl:value-of select="@id" /></p>
<xsl:template>

私が期待しているのは

<tr><p>1</p><p>4</p><p>7</p></tr>
<tr><p>10</p><p>13</p><p>16</p></tr>

私が持っているもの

<tr><p>1</p><p>2</p><p>3</p></tr>
<tr><p>10</p><p>11</p><p>12</p></tr>

では、なぜテンプレートの「トップ」は$part、次の兄弟を適用するのではなく、コンテキストを完全なツリーに変更したのでしょうか? そして、予想されるバリアントを取得する方法は?

4

2 に答える 2

0

XPath は入力ツリー内のノードを選択しますが、その入力ツリーを変更することはありません。したがって、いくつかのノードを選択しても、ツリー内の構造と関係はまったく変更されず、兄弟、子、または祖先は同じままです。ツリーを操作する場合は、XSLT または XQuery を使用します。すでに XSLT を使用しているため、XSLT 1.0 ではテンプレートを記述して新しい構造の結果ツリー フラグメントを作成し、拡張関数を適用した後exsl:node-setに中間ツリーを処理できるようにする必要があります。XSLT 2.0 では拡張機能は必要ありませんが、中間ツリーを構築する必要があります。

必要な出力を達成するには、使用できます

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">

<xsl:output indent="yes" method="html"/>

<xsl:template match="a">
  <xsl:variable name="part" select="b[@ol = 1]" />
  <xsl:apply-templates mode="top" select="$part[position() mod 3 = 1]" />
</xsl:template>

<xsl:template mode="top" match="*">
    <tr>
        <xsl:apply-templates mode="inner" select=".|following-sibling::b[@ol = 1][not(position() > 2)]" />
    </tr>
</xsl:template>

<xsl:template mode="inner" match="*">
    <p><xsl:value-of select="@id" /></p>
</xsl:template>

</xsl:stylesheet>

その XSLT スタイルシートで Saxon 6.5.5 が変換されます

<a>
    <b id="1" ol="1" />
    <b id="2" ol="0" />
    <b id="3" ol="0" />
    <b id="4" ol="1" />
    <b id="5" ol="0" />
    <b id="6" ol="0" />
    <b id="7" ol="1" />
    <b id="8" ol="0" />
    <b id="9" ol="0" />
    <b id="10" ol="1" />
    <b id="11" ol="0" />
    <b id="12" ol="0" />
    <b id="13" ol="1" />
    <b id="14" ol="0" />
    <b id="15" ol="0" />
    <b id="16" ol="1" />
</a>

の中へ

<tr>
   <p>1</p>
   <p>4</p>
   <p>7</p>
</tr>
<tr>
   <p>10</p>
   <p>13</p>
   <p>16</p>
</tr>
于 2013-08-15T11:39:13.693 に答える