7 年前のこの投稿は、Xalan 固有の非 XSLT ソリューションが利用可能である可能性があることを示唆していますが、実装の独立性と Michael の反応により、動作する XSLT1 ベースのソリューションを探す方向に進みました。
ここにあります; 他の人にとって役に立つかどうかはわかりません。もっと簡単な方法があるのだろうか?
すべてが正しく設定されていれば、XSLT を利用できます。仕様から:
XSLT では、最も外側の式 (つまり、別の式の一部ではない式) は、次のようにコンテキストを取得します。
コンテキスト ノードは現在のノードから取得されます
コンテキスト位置は、現在のノード リスト内の現在のノードの位置から取得されます。最初の位置は 1
最後に、式 $expression を変数 $result に適用した結果を取得します。
<xsl:variable name="result" >
<xsl:apply-templates select="$vNodeSet" mode="myeval">
<xsl:with-param name="expression" ><xsl:value-of select="$expression"/></xsl:with-param>
<xsl:with-param name="pos" ><xsl:value-of select="$pos"/></xsl:with-param>
</xsl:apply-templates>
</xsl:variable>
その apply-templates は、適切な「現在のノード リスト」を次のテンプレートにプッシュします。
<xsl:template match="*" mode="myeval">
<xsl:param name="expression">1. </xsl:param>
<xsl:param name="pos">3</xsl:param>
<xsl:choose>
<xsl:when test="position()=$pos">
<xsl:value-of select="dyn:evaluate($expression)" /></xsl:when>
<xsl:otherwise />
</xsl:choose>
</xsl:template>
このテンプレートは、「現在のノード」にしたいノードの式を評価します。知らせ:
- dy:evaluate の使用 (Martin に感謝!)
- $pos は、現在のノードとして必要なものを識別します。
以前の質問に対する Dimitre の回答を使用して $pos を計算できました。彼の変数名 vNodeSet も使用しました
Dimitre、Martin、Michael に感謝します。