如何将参数传递给可以在xsl:key中使用的xslt?

时间:2011-01-26 16:54:54

标签: xslt

这个XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:param name="paramvalue" />
  <xsl:key name="test" match="$paramvalue" use="generate-id()" />

  <!-- template rules -->
</xsl:stylesheet>

失败,因为您似乎在match的{​​{1}}属性中没有参数值。除了动态修改xslt之外,还有什么方法可以做到这一点吗?

2 个答案:

答案 0 :(得分:2)

  

如何将参数传递给   xslt可以在xsl:key中使用吗?

使用XSLT 2.0。

在XSLT 1.0中“use属性或match属性的值包含VariableReference 是错误的。”的 as per spec

这个限制被放在规范中,目的是阻止一系列循环引用。

  

除了之外,还有什么方法可以做到这一点   在运行中修改xslt?

是的,您的XSLT代码可能会生成一个新的xslt样式表,它使用键定义中参数的特定

或者,如果参数的值来自有限集,您可以为每个可能的值定义键 - 参数本身将包含要使用的键的名称 - - 请注意key()函数的键名参数可以是任何表达式,包括变量引用。

答案 1 :(得分:0)

首先,这是一个奇怪的讽刺,因为大多数人每次都想知道一个键匹配的节点。但除此之外,@ Dimitre的优秀答案(使用XSLT 2.0),您可以使用外部输入源作为document()函数的参数。

此样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:key name="Key"
             match="*[name() = document('param.xml')/*/param]"
             use="generate-id()"/>
    <xsl:template match="text()"/>
    <xsl:template match="*[key('Key',generate-id())]">
        <xsl:copy-of select="."/>
    </xsl:template>
</xsl:stylesheet>

使用此输入(也称为“param.xml”):

<root>
    <param>data</param>
    <data>something</data>
</root>

输出:

<data>something</data>