この XSLT 2.0 テンプレートがあります。
<xsl:template match="footnote">
<xsl:variable name = "string" select="./text()"/>
<xsl:variable name = "bool">
<xsl:choose>
<xsl:when test="$string = preceding::footnote/text()">
<xsl:text>false</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>true</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:if test="$bool = 'true'">
<xsl:variable name="footnoteCount">
<xsl:call-template name="getItemNumber">
<xsl:with-param name="node" select="."/>
</xsl:call-template>
</xsl:variable>
<!-- DO XSL-FO TRANSFORMATION STUFF-->
</xsl:if>
<xsl:if test="$bool = 'false'">
<xsl:variable name = "footnoteCount">
<xsl:if test="$string = preceding::footnote/text()">
<xsl:value-of select="preceding::footnote/$footnoteCount"/>
</xsl:if>
</xsl:variable>
<!--DO XSL-FO TRANSFORMATION STUFF-->
</xsl:if>
</xsl:template>
サンプル XML を編集しました。これを変換したい:
<footnote>Foo bar</footnote>
<footnote>Bar foo</footnote>
<footnote>Foo bar</footnote>
<footnote>Foo bar</footnote>
<footnote>Bar</footnote>
<footnote>Foo</footnote>
これに:
<footnote>Foo bar</footnote>
<footnote>Bar foo</footnote>
<footnote>Bar</footnote>
<footnote>Foo</footnote
そして、XSL-FO を使用してスタイルを設定します。このスタイリングの目的は、本文のテキストに$footnotecount
、ページの下部にレンダリングされる脚注への番号付き参照 ( で表される) を含めることです。複製されたフットネートが 1 回だけレンダリングされ、番号参照 ( $footnoteCount
) が複製ごとに同じになるように、ドキュメントを変換する必要があります。
したがって、このテンプレートでやろうとしていることは次のとおりです。
- 現在のノードのテキストを含む脚注要素が既に存在するかどうかを判断します。
- 存在しない場合 (つまり、'$bool' が 'true') は、前の脚注の番号を見つけ、それを増やし (これは 'getItemNumber' テンプレートで行われます)、'新しい' 脚注を作成します。存在する場合 ($bool が「false」)、テキストが一致するノードの $footnoteCount 変数を取得し、それを現在のノードに使用します。
私が問題を抱えているのは、脚注が既に存在するシナリオです。ノードが特定の基準を満たすかどうか (そのテキストが現在のノードの $string 変数と同じかどうか) に応じて、以前の特定のノードから $footnoteCount 変数を取得する方法がわかりません。$footnoteCount 変数は条件付きでのみ存在するという事実によって、さらに困難になっています (実際には、$bool は true または false のいずれかでなければならないため、常に存在する場合でも)。
ここで何をすべきかについて誰かアドバイスがありますか?