如何在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 = &quot;b2&quot;]', 'a/c') ! mf:testPath(current(), .)" separator="&#10;"/>
</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