gpt4 book ai didi

xml - 使用 Xpath 找到共同的 parent

转载 作者:数据小太阳 更新时间:2023-10-29 01:52:58 28 4
gpt4 key购买 nike

我想知道是否有任何方法可以使用 Xpath 访问公共(public)父节点。

<outer>
<main>
<a><b> sometext </b></a>
<c><d> sometext2 </d></c>
</main>
</outer>

我有文本节点 sometext 和 sometext2。有没有办法可以访问这两个节点的主要(共同父节点)?我不知道包含这些节点的 xml 的布局。

最佳答案

使用以下 XPath 1.0 表达式:

$v1/ancestor::*
[count(. | $v2/ancestor::*)
=
count($v2/ancestor::*)
]
[1]

其中 $v1 和 $v2 包含两个文本节点(如果您不在 XSLT 中使用 XPath,则必须将上述表达式中的 $v1 和 $v2 替换为 XPath 表达式选择这两个文本节点中的每一个)。

解释:

上述 XPath 1.0 表达式找到两个节点集的交集:$v1 的所有元素祖先的节点集和 $v2 的所有元素祖先的节点集。 这是通过所谓的 Kaysian 交集方法完成的(以 Michael Kay 的名字命名,他于 2000 年发现了这一点)。使用 Kaysian 交集方法,两个节点集 $ns1 和 $ns2 的交集由以下 XPath 表达式选择:

  $ns1[count(. | $ns2) = count($ns2)]

然后,我们必须从祖先的交集中选择最后一个元素。但是,因为我们使用的是反向轴(祖先),所以所需的节点位置必须表示为 1

通过应用以下转换,可以快速验证上述 XPath 表达式是否确实选择了最低公共(public)祖先:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="text"/>

<xsl:variable name="v1" select="/*/*/a/b/text()"/>
<xsl:variable name="v2" select="/*/*/c/d/text()"/>

<xsl:variable name="vCommonAncestor" select=
"$v1/ancestor::*
[count(. | $v2/ancestor::*)
=
count($v2/ancestor::*)
]
[1]"
/>

<xsl:template match="/">
<xsl:value-of select="name($vCommonAncestor)"/>
</xsl:template>
</xsl:stylesheet>

应用于最初提供的 XML 文档时(已更正为格式正确的 XML):

<outer>
<main>
<a>
<b>sometext</b>
</a>
<c>
<d>sometext2</d>
</c>
</main>
</outer>

想要的结果(作为两个文本节点的最低公共(public)祖先的元素的名称)已生成:

主要

选择两个节点的最低公共(public)祖先的 XPath 2.0 表达式更简单,因为它使用标准的 XPath 2.0 运算符“相交”:

   ($v1/ancestor::* intersect $v2/ancestor::*) 
[last()]

关于xml - 使用 Xpath 找到共同的 parent ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/538293/

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