Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将参数传递给xsl:key中使用的xslt?_Xslt - Fatal编程技术网

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

如何将参数传递给xsl:key中使用的xslt?,xslt,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:sty

此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>
失败,因为xsl:key的match属性中似乎没有参数值。除了动态修改xslt之外,还有其他方法可以做到这一点吗

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

为此使用XSLT2.0

在XSLT1.0中,use属性或match属性的值包含VariableReference是一个错误

规范中的这一限制是为了防止循环引用链

除此之外还有别的办法吗 动态修改xslt

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


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

首先,这是一个奇怪的问题,因为大多数情况下,每当人们想知道密钥匹配的节点时。除此之外,@Dimitre的优秀答案使用XSLT2.0,您可以使用和外部输入源作为文档函数的参数

此样式表:

<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>

这主意不错。。问题是我需要传递的参数实际上是一个XPath表达式!客户机代码需要能够基于给定的XPath指定元素或属性的选择。不幸的是,在这种情况下,我也仅限于XSLT1.0。@flyn1179:首先,它不能是XPath表达式,它必须是XSLT模式。第二,有了适当的XML词汇表,QQ就可以选择分组/排序键了。使用不知名的标准XML词汇表,您可以使用precisionWell的parent和self QName测试。不,我不能使用XSLT 2.0,值不是来自有限的集合,生成新样式表几乎肯定比动态修改现有XSLT更复杂;毕竟,这只是改变了一个属性的值。在某些情况下,这些可能是可行的解决方案,但不是我想做的。@Flynn1179:您显然没有研究过将密钥名称作为参数传递的技术。。。这是XSLT1.0,易于使用和理解,显然您还没有看过关于Alejandro答案的评论。我已经研究过这种技术,虽然它通常很有用,但我认为它对我的情况没有帮助,因为我需要匹配传入的XPath的键。如果你不知道,请在回答中提供一个有用的例子。