我正在阅读快捷方式'//',这显然是以下的捷径:
'/后代或自身'
很明显,从这样一个表达的简单例子可以期待什么, 例如,// 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>
谢谢!
答案 0 :(得分:4)
'// myNode'和'// aNode // myNode'会产生完全相同的结果吗?
是的,在这种情况下,因为所有myNodes
也是anode
的后代。但是,在一般意义上,//aNode//myNode
显然不匹配祖先树中没有anode
父节点的节点。
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
答案 1 :(得分:1)
你问“Are'// myNode'和'// aNode // myNode'会产生完全相同的东西吗?”
不一定。第一个将返回文档中名为myNode
的所有元素;第二个将返回名为myNode
的所有元素,这些元素作为名为aNode
的元素的后代出现。在您的示例XML中,这两个描述碰巧定义了相同的集合,但在某些XML文档中它们不会。
另一方面,表达式//aNode//myNode
和//myNode[ancestor::aNode]
将始终返回相同的节点集。