次のテストコードがあります...ノードセットをパラメータとして渡そうとしています。何時間も経って、ようやくテンプレートに渡すことができました。
ノードセットをテンプレートに渡す方法:
<xsl:call-template name="listing">
<xsl:with-param name="customData">
<xsl:apply-templates select="exslt:node-set($data)"/>
</xsl:with-param>
</xsl:call-template>
私のテンプレートがそれを受け取る方法:
<xsl:template name="listing">
<xsl:param name="customData" select="/.."/>
<xsl:variable name="data">
<xsl:choose>
<xsl:when test="not($customData)">
<xsl:value-of select="/data"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$customData"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<textarea><xsl:copy-of select="$data"></xsl:copy-of></textarea>
</xsl:call-template>
ワンライナーでパラメーターを設定すると、文句はありません...例:
<xsl:variable name="data" select="$customData"/>
しかし、このように設定しようとするとすぐに壊れます:
<xsl:variable name="data">
<xsl:value-of select="$customData"/>
</xsl:variable>
次のエラー メッセージが表示されます: org.apache.xpath.objects.XRTreeFrag は org.apache.xpath.objects.XNodeSet にキャストできません
2000 年にさかのぼる別のスレッドを見つけることができただけで、この同様の問題について話しています... node-set($customData)/* のようなものを使用してノードセットを再設定する必要がありますが、それを試してみたところ、ダメ。
編集: OK、テンプレート内のノードセットを正常に渡したことを確認できます。しかし、私はまだそれを自分の変数にコピーできません...それはまだRTFであると言い続けました。
<xsl:template name="listing">
<xsl:param name="customData" as="node-set"/>
<!--<xsl:variable name="data" select="/data"/>-->
<xsl:variable name="data">
<xsl:choose>
<xsl:when test="count($customData) != 0">
<xsl:copy-of select="$customData"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="/data"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<textarea><xsl:value-of select="$customData/record[1]"/></textarea>
<textarea><xsl:value-of select="/data/record[1]"/></textarea>
<textarea><xsl:value-of select="$data/record[1]"/></textarea>
</xsl:template>
上記のテストは、$customData と元の /data に問題なくアクセスできることを示しています。どちらもレコードを表示していますが、$data が台無しになっています。つまり、$customData から $data へのコピーが機能していなかったということです...
次の方法を試しましたが、どれも機能しません。
<xsl:copy-of select="$customData"/>
<xsl:value-of select="$customData"/>
<xsl:apply-templates select="exslt:node-set($customData)"/>
<xsl:apply-templates select="exslt:node-set($customData)/data"/>
何か案が...?