如何在XSLT测试中使用变量作为XPath
我有一个接受参数如何在XSLT测试中使用变量作为XPath,xslt,xpath,Xslt,Xpath,我有一个接受参数$path的函数。它应该包含一个XPath表达式,我的目标是测试表达式末尾的节点是否有效 然而,当我试着去做 <xsl:function name="testPath"> <xsl:param name="path"> <xsl:if test="$path"> 它将$path测试为字符串,而不是XPath表达式(这意味着如果$path不为空,则返回true)。如果我在中硬编码XPath表达式,那么它会正确地执行检查 我正
$path
的函数。它应该包含一个XPath表达式,我的目标是测试表达式末尾的节点是否有效
然而,当我试着去做
<xsl:function name="testPath">
<xsl:param name="path">
<xsl:if test="$path">
它将$path
测试为字符串,而不是XPath表达式(这意味着如果$path
不为空,则返回true)。如果我在中硬编码XPath表达式,那么它会正确地执行检查
我正在使用XPath2.0
如何将变量用作XPath表达式 XSLT 3.0支持动态XPath计算。下面是一个使用Saxon 9.5 PE的示例:
<xsl:stylesheet
version="3.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:mf="http://example.org/mf"
exclude-result-prefixes="xs mf">
<xsl:output method="text"/>
<xsl:function name="mf:testPath" as="xs:boolean">
<xsl:param name="context-node" as="node()"/>
<xsl:param name="path" as="xs:string"/>
<xsl:variable name="seq" as="item()*">
<xsl:evaluate xpath="$path" context-item="$context-node"/>
</xsl:variable>
<xsl:sequence select="exists($seq)"/>
</xsl:function>
<xsl:template match="/">
<xsl:value-of select="('a/b[@id = "b2"]', 'a/c') ! mf:testPath(current(), .)" separator=" "/>
</xsl:template>
</xsl:stylesheet>
参数是如何填充的?--您使用的是哪个版本的XSLT?动态XPath求值是XSLT 3.0的可选功能,某些处理器也支持它作为扩展。@michael.hor257k我更新了我的代码。您仍然没有向我们展示调用函数时如何填充参数。为什么不发布一个完整的(XML+XSLT)示例,使我们能够重现这个问题?我认为只需在参数中添加as=“node()”属性就可以解决问题。成为
<a>
<b id="b1">foo</b>
<b id="b2">bar</b>
</a>
true
false