0

XPath 評価の条件として変数を使用するときに問題に直面しました。私は正常に動作する次のテンプレートを持っています:

<xsl:template name="typeReasonDic">
    <xsl:variable name="dic" select="$schema//xs:simpleType[@name = 'type_reason_et']"/>
    <!-- do something with the variable -->
</xsl:template>

ただし、次のように変更すると、次のようになります。

<xsl:template name="typeReasonDic">
    <xsl:param name="choose_dic" select="@name = 'type_reason_et'"/>

    <xsl:variable name="dic" select="$schema//xs:simpleType[$choose_dic]"/>
    <!-- do something with the variable -->
</xsl:template>

目的のノードが見つかりません。

私が取得したいのは、必要に応じてオーバーライドできるデフォルト値を持つテンプレートです。$choose_dic

ここで何が欠けていますか?

UPD:私がやろうとしていることの説明で見つけたこのリンクがありますが、うまくいかないようです。

4

3 に答える 3

1

することで

<xsl:param name="choose_dic" select="@name = 'type_reason_et'"/>

XSL エンジンは "@name = 'type_reason_et'" を XPath 式として評価しようとし、RESULT を変数に割り当てます。

代わりに、次の変数宣言を使用する必要があります。

<xsl:param name="choose_dic">@name = 'type_reason_et'</xsl:param>

これはデフォルト値ですが、xsl:with-param を使用してテンプレートを呼び出すときにオーバーライドできます。

于 2013-01-17T11:32:16.713 に答える
1

XSLT は、実行時に文字列からコードを連結して動的に評価できるようなマクロ言語ではありません。したがって、一般的には、文字列に格納された XPath 式を評価するための拡張関数が必要になるか、http://www.saxonica.com/documentation/xsl-elements/evaluateのような新しい XSLT 3.0 機能を調べる必要があります。 .xml

XSLT 1.0 または 2.0 の範囲で可能なことは、たとえば次のことです。

<xsl:param name="p1" select="'foo'"/>

<xsl:variable name="v1" select="//bar[@att = $p1]"/>

にはparam、属性ノードや要素ノードなどのノード内の値など、他の値と比較する値が保持されます。

于 2013-01-17T11:48:14.960 に答える
1

拡張機能なしで XSLT 1.0 または 2.0 で直接これを行うことはできません。問題は、

<xsl:template name="typeReasonDic">
    <xsl:param name="choose_dic" select="@name = 'type_reason_et'"/>

    <xsl:variable name="dic" select="$schema//xs:simpleType[$choose_dic]"/>
    <!-- do something with the variable -->
</xsl:template>

は、現在のコンテキストで<xsl:param>そのselect式を 1 回評価し、この評価の真/偽の結果を$choose_dic変数に格納します。したがって、 は、 の下にあるすべての要素を<xsl:variable>選択する(が true の場合) か、いずれの要素も選択しない( の場合) が false です。これは、 xs:simpleType$schema$choose_dic$choose_dic

<xsl:variable name="dic" select="$schema//xs:simpleType[@name = 'type_reason_et']"/>

これは@name = 'type_reason_et'、 each のコンテキストで繰り返し評価さxsl:simpleTypeれ、式が true と評価された要素を選択します。

XPath 式を文字列として保存する場合、Saxon を使用している場合dyn:evaluateは XSLT 3.0要素などの拡張関数を使用できます。xsl:evaluate

于 2013-01-17T11:50:44.467 に答える