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 表达式,或者您需要研究新的 XSLT 3.0 功能,例如http://www.saxonica.com/documentation/xsl-elements/evaluate .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表达式进行一次评估,并将此评估的真/假结果存储在$choose_dic变量中。因此,<xsl:variable>将选择(如果为真)下的所有 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:evaluateXSLT 3.0元素。xsl:evaluate

于 2013-01-17T11:50:44.467 回答