如何在XSLT测试中将变量用作XPath

时间:2015-04-16 16:18:54

标签: xslt xpath

我有一个接受参数$path的函数。它应该包含一个XPath表达式,我的目标是测试表达式末尾的节点是否有效。

然而,当我尝试做

<xsl:function name="testPath">
    <xsl:param name="path">
    <xsl:if test="$path">

它将$path测试为字符串,而不是XPath表达式(意味着如果$path不为空则返回true)。如果我对XPath表达式进行硬编码,那么它会正确地进行检查。

我正在使用XPath 2.0

如何将变量用作XPath表达式?

1 个答案:

答案 0 :(得分:0)

XSLT 3.0支持动态XPath评估an optional feature。以下是使用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>

针对输入样本进行评估

<a>
  <b id="b1">foo</b>
  <b id="b2">bar</b>
</a>

输出

true
false