试图理解多个谓词
Trying to understand multiple predicates
我遇到了 http://xpather.com,它可以让您编写 XPath 表达式。它带有一个示例 XML 文档,与此文档类似:
<app>
<abstract>a</abstract>
<description>
<subject>s1</subject>
<subject>s2</subject>
</description>
<extra-notes>
<note>n1</note>
<note>n2</note>
<note>n3</note>
<note>n4</note>
</extra-notes>
</app>
并且有一个示例 XPath 表达式:.//*[self::abstract or self::subject or self::note][position() <= 2]
结果序列为
<abstract>a</abstract>
<subject>s1</subject>
<subject>s2</subject>
<note>n1</note>
<note>n2</note>
现在我试图理解为什么结果是这样的:第一个谓词选择所有摘要、主题和注释元素,第二个谓词将其限制为 position() <= 2
。我的直觉预期是 XPath 表达式仅选择两个节点(abstract 和 subject1),但它实际上从每个选定节点中选择前两个元素。到底是怎么回事?
仅供测试:这是我的简单样式表:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output indent="yes"/>
<xsl:template match="/">
<e>
<xsl:copy-of select=".//*[self::abstract or self::subject or self::note][position() <= 2]"/>
</e>
</xsl:template>
</xsl:stylesheet>
.//*[self::abstract or self::subject or self::note]
表示 ./descendant-or-self::node()/*[self::abstract or self::subject or self::note]
并且您的位置谓词适用于 /*[self::abstract or self::subject or self::note]
的最后一步,因此选择 *[self::abstract or self::subject or self::note]
选择的任何第一个或第二个子元素。
使用:
(//*[self::abstract or self::subject or self::note])[not(position() > 2)]
有关解释,请参阅此答案:
XPath query to get nth instance of an element :
Remember: The []
operator has higher precedence (priority) than the //
abbreviation.
我遇到了 http://xpather.com,它可以让您编写 XPath 表达式。它带有一个示例 XML 文档,与此文档类似:
<app>
<abstract>a</abstract>
<description>
<subject>s1</subject>
<subject>s2</subject>
</description>
<extra-notes>
<note>n1</note>
<note>n2</note>
<note>n3</note>
<note>n4</note>
</extra-notes>
</app>
并且有一个示例 XPath 表达式:.//*[self::abstract or self::subject or self::note][position() <= 2]
结果序列为
<abstract>a</abstract>
<subject>s1</subject>
<subject>s2</subject>
<note>n1</note>
<note>n2</note>
现在我试图理解为什么结果是这样的:第一个谓词选择所有摘要、主题和注释元素,第二个谓词将其限制为 position() <= 2
。我的直觉预期是 XPath 表达式仅选择两个节点(abstract 和 subject1),但它实际上从每个选定节点中选择前两个元素。到底是怎么回事?
仅供测试:这是我的简单样式表:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output indent="yes"/>
<xsl:template match="/">
<e>
<xsl:copy-of select=".//*[self::abstract or self::subject or self::note][position() <= 2]"/>
</e>
</xsl:template>
</xsl:stylesheet>
.//*[self::abstract or self::subject or self::note]
表示 ./descendant-or-self::node()/*[self::abstract or self::subject or self::note]
并且您的位置谓词适用于 /*[self::abstract or self::subject or self::note]
的最后一步,因此选择 *[self::abstract or self::subject or self::note]
选择的任何第一个或第二个子元素。
使用:
(//*[self::abstract or self::subject or self::note])[not(position() > 2)]
有关解释,请参阅此答案:
XPath query to get nth instance of an element :
Remember: The
[]
operator has higher precedence (priority) than the//
abbreviation.