1

次のテストコードがあります...ノードセットをパラメータとして渡そうとしています。何時間も経って、ようやくテンプレートに渡すことができました。

ノードセットをテンプレートに渡す方法:

<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"/>

何か案が...?

4

3 に答える 3

4

このエラー メッセージは、XSLT 1.0 プロセッサである Xalan からのものです。Xalan を使用している場合は、おそらく Java を使用しています。つまり、Saxon の形式で XSLT 2.0 に移行しない理由はまったくありません。XSLT 2.0 では、XSLT 1.0 の制限の多くが取り除かれていることがわかりますが、これは最も苛立たしいものの 1 つです。

XSLT 2.0 に移行できない正当な理由がある場合 (そしてその理由を考えるのが難しい場合)、結果ツリーのフラグメント (つまり、子命令を使用して定義された変数) をドキュメント ノードに追加します。

于 2012-07-18T23:07:49.957 に答える
2

基本的に、apply-template を使用するのではなく、RTF をパラメーターとしてテンプレートに渡す必要があります。それが私がそれを機能させる唯一の方法です。

<xsl:with-param name="data" select="exslt:node-set($customData)"/>

このメソッドを使用して、XSL レベルでデータをMODIFYすることができました。これは本当にクールです。基本的に必要なデータを操作してから、ルート / を再構築し、customData をテンプレート関数に渡します。

そのため、データをルートから読み取るのではなく、自分で変更したデータ (XSL 内で構築) を読み取ります。

于 2012-08-03T14:22:52.470 に答える