我有一个接受参数$path
的函数。它应该包含一个XPath表达式,我的目标是测试表达式末尾的节点是否有效。
然而,当我尝试做
时<xsl:function name="testPath">
<xsl:param name="path">
<xsl:if test="$path">
它将$path
测试为字符串,而不是XPath表达式(意味着如果$path
不为空则返回true)。如果我对XPath表达式进行硬编码,那么它会正确地进行检查。
我正在使用XPath 2.0
如何将变量用作XPath表达式?
答案 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 = "b2"]', 'a/c') ! mf:testPath(current(), .)" separator=" "/>
</xsl:template>
</xsl:stylesheet>
针对输入样本进行评估
<a>
<b id="b1">foo</b>
<b id="b2">bar</b>
</a>
输出
true
false