我需要一个 XSLT 函数,它会将 xpath 返回到它调用的节点。
XML
<root>
<node>
<subnode />
<subnode />
<subnode />
</node>
<node>
<subnode>
<subsubnode >
<xsl:value-of select="fn:generateXPath()" />
</subsubnode >
</subnode>
</node>
</root>
XSL
<xsl:template match="root/node/subnode/sub" >
<xsl:value-of select="fn:generateXPath()" />
</xsl:template>
<xsl:function name="fn:generateXPath" >
<xsl:for-each select="ancestor::*">
<xsl:value-of select="name()" />
</xsl:for-each>
<xsl:value-of select="name()" />
</xsl:function>
我尝试使用上面的函数,但它抛出一个错误:
XPDY0002:此处无法选择节点:上下文项未定义
但是当我在命名模板中尝试这个时,我能够得到结果。这可以使用来实现吗xslt:function
.
我尝试使用上面的函数,但它抛出一个错误:
XPDY0002: Cannot select a node here: the context item is undefined
但是当我在命名模板中尝试这个时,我能够得到
结果。
根据 W3C XSLT 2.0 规范:
"在样式表函数体内,焦点最初是
不明确的;这意味着任何引用上下文项的尝试,
上下文位置或上下文大小是不可恢复的动态错误。
[XPDY0002]”
在你的代码中:
<xsl:function name="fn:generateXPath" >
<xsl:for-each select="ancestor::*">
<xsl:value-of select="name()" />
</xsl:for-each>
<xsl:value-of select="name()" />
</xsl:function>
有一些relative只能根据上下文项(焦点、当前节点)计算的表达式,但是定义中没有这样的定义(请参阅上面的引用),因此您会收到报告的错误。
Solution:
为此函数添加一个参数——很自然,这将是节点,即用于选择所需节点的 XPath:
<xsl:function name="fn:generateXPath" as="xs:string" >
<xsl:param name="pNode" as="node()"/>
<xsl:for-each select="$pNode/ancestor::*">
<xsl:value-of select="name()" />
</xsl:for-each>
<xsl:value-of select="name($pNode)" />
</xsl:function>
并通过以下方式调用该函数:
fn:generateXPath(someNode)
Note:显然,你必须将每个名称连接到"/"
字符,并通过使用谓词中的位置来缩小表达式范围以不选择节点的任何兄弟节点。有关为节点构建 XPath 表达式的完整且正确的解决方案,请参阅我对此问题的回答:https://stackoverflow.com/a/4747858/36305
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)