这个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之外,还有什么方法可以做到这一点吗?
答案 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>