试图理解多个谓词

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() &lt;= 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.