gpt4 book ai didi

XSLT 函数获取节点的 xpath

转载 作者:行者123 更新时间:2023-12-03 15:59:03 26 4
gpt4 key购买 nike

我需要一个 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: Cannot select a node here: the context item is undefined



但是当我在命名模板中尝试这个时,我能够得到结果。这可以使用 xslt:function 实现吗? .

最佳答案

I tried with the above function but it throws an error:

XPDY0002: Cannot select a node here: the context item is undefined

But when I tried this in a named template I'm able to get the result.



根据 W3C XSLT 2.0 规范:

"Within the body of a stylesheet function, the focus is initially undefined; this means that any attempt to reference the context item, context position, or context size is a non-recoverable dynamic error. [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>

有许多相对表达式只能针对上下文项(焦点、当前节点)进行评估,但是没有这样的定义(参见上面的引用),因此您会得到报告的错误。

解决方案 :

为这个函数添加一个参数——很自然,这将是节点,用于选择所需的 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)

备注 :显然,您必须将每个名称连接到 "/"字符,并通过使用谓词中的位置来缩小表达式的范围,不选择节点的任何兄弟节点。有关为节点构建 XPath 表达式的完整且正确的解决方案,请参阅我对此问题的回答: https://stackoverflow.com/a/4747858/36305

关于XSLT 函数获取节点的 xpath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8503566/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com