gpt4 book ai didi

xpath - 具有多个谓词对等的xpath

转载 作者:行者123 更新时间:2023-12-03 16:17:41 25 4
gpt4 key购买 nike

有人告诉我以下内容不一样:

a[1][@attr="foo"]
a[@attr="foo"][1]


有人可以解释为什么会这样吗?

最佳答案

将XPath表达式视为定义一个结果集1-满足XPath表达式中所述的所有要求的一组节点。 XPath表达式的谓词([]中的部分)对结果集没有影响,或者它们会逐渐缩小结果集的范围。

换句话说,在以下表达式中:

//xyz[@abc="yes"]


[@abc="yes"]将定义在其左侧的结果集减少 //xyz

请注意,正如Michael Kay所建议的,以下所有内容仅适用于具有至少一个位置谓词的XPath表达式。位置谓词可以是数字: [1]或计算为数字,或者包含 position()last()

如果不存在位置谓词,则XPath表达式中谓词的顺序并不重要。



考虑以下简单的输入文档:

<root>
<a attr="other"/>
<a attr="foo"/>
<a attr="other"/>
<a attr="foo"/>
</root>


如您所见, a[@attr = 'foo']不是 root的第一个子元素。如果我们申请

//a[1]


对于本文档,这当然会导致

<a attr="other"/>


现在,至关重要的是,如果我们向表达式添加另一个谓词,如下所示:

//a[1][@attr="foo"]


这样, [@attr="foo"]只能影响已经由 //a[1]定义的结果集。在此结果集中,没有 a[@attr="foo"]-最终结果为空。

另一方面,如果我们从

//a[@attr="foo"]


结果将是

<a attr="foo"/>
-----------------------
<a attr="foo"/>


在这种情况下,如果我们添加第二个谓词:

//a[@attr="foo"][1]


第二个谓词 [1]可以缩小 //a[@attr="foo"]的结果集,使其仅包含那些节点中的第一个。



如果您知道XSLT,则可能会发现XSLT(和XPath 2.0)证明了这一点:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />

<xsl:template match="/">
<result1>
<xsl:copy-of select="//a[1][@attr='foo']"/>
</result1>
<result2>
<xsl:copy-of select="//a[@attr='foo'][1]"/>
</result2>
</xsl:template>

</xsl:transform>


结果将是

<result1/>
<result2>
<a attr="foo"/>
</result2>




1从技术上讲,只有XPath 1.0将此结果称为节点集。在XPath 2.0中,所有集合都成为真实的节点序列。

关于xpath - 具有多个谓词对等的xpath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28359247/

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