当前位置 : 主页 > 网页制作 > xml >

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

来源:互联网 收集:自由互联 发布时间:2021-06-13
我正在阅读快捷方式’//’,这显然是一条捷径: “/后裔或自身” 很明显,从这样一个表达的一个简单例子可以期待什么, 例如, // MYNODE 它将返回文档中所有实例的节点列表,这些实例位于
我正在阅读快捷方式’//’,这显然是一条捷径:

“/后裔或自身”

很明显,从这样一个表达的一个简单例子可以期待什么,
例如,

// MYNODE

它将返回文档中所有实例的节点列表,这些实例位于根目录中,名为“myNode”.

但是,更复杂的表达式的含义是什么,例如:

// //阳极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 // myNode显然不匹配其祖先树中没有阳极父节点的节点.

xpath:

//aNode//myNode

将忽略aNode和myNode之间的任何中间层次结构,即它将匹配/ 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
网友评论