2013-01-17 48 views
0

我在使用变量作为XPath评估的条件时遇到了问题。我有以下模板的正常工作:如何使用XSL变量作为评估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:this链接我找到了我想要做的事情的描述,但它似乎不适用于我。

回答

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>将选择下$schema要么所有xs:simpleType元素(如果$choose_dic为true)或他们都不(如果$choose_dic)是假的。这是从

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

非常不同,这将评估@name = 'type_reason_et'反复中,在每个xsl:simpleType的情况下,并选择其表达评价为真正的那些元素。

如果您将XPath表达式作为字符串存储,则可以使用扩展功能,例如dyn:evaluate或XSLT 3.0 xsl:evaluate元素(如果您使用的是撒克逊)。

1

这样做

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

的XSL引擎将试图评估“@name =‘type_reason_et’”作为XPath表达式,并将结果分配给您的变量。

你应该使用下面的变量声明代替:

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

这是默认值,但是当你使用XSL打电话给你的模板,你可以重写它:用-PARAM。

+0

请参阅我更新的问题中的链接。那里接受的答案似乎正在做我正在做的事情。我试图用'替换'',但它仍然不起作用。 – svz

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保持你比较于其它的值,例如那些在像属性或元素节点的节点。

+0

但是,例如,如果我需要将条件更改为“<”。那么我怎么会有一个被我接受的答案呢?查看我的问题更新中的链接。 – svz

+0

如果你不接受答案,我不知道是谁做的。所有的答案都是正确的。但是,也许你在得到答案后通过改变问题而迷惑了事情 - 我个人认为这是最好的避免。 –