gpt4 book ai didi

xml - xpath/descendant-or-self - 在特定树中搜索节点

转载 作者:数据小太阳 更新时间:2023-10-29 02:05:16 33 4
gpt4 key购买 nike

我正在阅读有关快捷方式“//”的信息,它显然是用于:

'/后裔或自己'

从这样一个表达式的简单示例中可以清楚地知道会发生什么,例如,

//我的节点

它将返回文档中所有实例的节点列表,从根节点找到名为“myNode”的元素。

但是,更复杂的表达是什么意思,比如:

//一个节点//我的节点

?

因为//(作为'/descendant-or-self'的快捷方式)匹配根节点两次,这是否意味着表达式“//aNode”的第一部分是多余的,只会增加完成表达式执行所需的时间(在仍然只找到整个文档中的所有表达式之后,“myNode”) ?

“//myNode”和“//aNode//myNode”会产生完全相同的结果吗?

最后,如果我在文档中搜索节点“myNode”的实例,它是节点“interestingTree”的间接后代。但我不想要节点“myNode”的实例,它是节点“nonInterestingTree”的间接后代,我该怎么做?

例如在文档中搜索:

<root>
<anode>
<interestingTree>
<unknownTree>
<myNode/><!-- I want to find this one, not the other, where I don't know the path indicated by 'unknownTree' -->
</unknownTree>
</interestingTree>
<nonInterestingTree>
<unknownTree>
<myNode/>
</unknownTree>
</nonInterestingTree>
</anode>
<anode>
<someOtherNode/>
</anode>
</root>

谢谢!

最佳答案

Are '//myNode' and '//aNode//myNode' going to result in exactly the same thing?

是的,在这种情况下,因为所有 myNodes 也是 anode 的后代。然而,在一般意义上,//aNode//myNode 显然不会匹配其祖先树中没有 anode 父节点的节点。

xpath:

//aNode//myNode

将忽略 aNodemyNode 之间的任何中间层次结构,即它将匹配 /aNode/myNode/anyNodes/anode/myNode/anyNodes/anode/xyzNode/myNode

这回答了你的最后一个问题,你可以像这样在有趣的子路径中找到节点:(同样,忽略层次结构中的任何中间元素)

//anode//interestingTree//myNode

当然,理想情况下,您的路径应该尽可能明确,因为 // 可能需要搜索大量元素,从而导致性能开销。

编辑这可能有帮助吗?

为了清晰起见,我已将您的 xml 输入调整为:

<root>
<anode>
<interestingTree>
<unknownTree>
<myNode>
MyNode In Interesting Tree
</myNode>
</unknownTree>
</interestingTree>
<nonInterestingTree>
<unknownTree>
<myNode>
MyNode In Non-Interesting Tree
</myNode>
</unknownTree>
</nonInterestingTree>
</anode>
<anode>
<someOtherNode/>
</anode>
<bnode>
<myNode>
MyNode in BNode
</myNode>
</bnode>
</root>

通过样式表解析时:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
Matched by `//myNode`
<xsl:apply-templates select="//myNode">
</xsl:apply-templates>

Matched by `//aNode//myNode`
<xsl:apply-templates select="//anode//myNode">
</xsl:apply-templates>

Matched by `//aNode//interestingTree//myNode`
<xsl:apply-templates select="//anode//interestingTree//myNode">
</xsl:apply-templates>
</xsl:template>

<xsl:template match="myNode">
<xsl:value-of select="text()"/>
</xsl:template>
</xsl:stylesheet>

返回以下内容:

Matched by `//myNode`
MyNode In Interesting Tree
MyNode In Non-Interesting Tree
MyNode in BNode

Matched by `//aNode//myNode`
MyNode In Interesting Tree
MyNode In Non-Interesting Tree

Matched by `//aNode//interestingTree//myNode`
MyNode In Interesting Tree

关于xml - xpath/descendant-or-self - 在特定树中搜索节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12530657/

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