Select 每个节点的第一个元素通过 XPath

Select first element of each node via XPath

我有一个 XML 这样的文档

<Persons>
  <Company>
    ...
    <Employee>
        <name>1</name>
        <name>2</name>
    </Employee>
    <Employee>
        <name>3</name>
        <name>4</name>
    </Employee>
  </Company>
  <Company>
    ...
    <Employee>
        <name>5</name>
        <name>6</name>
    </Employee>
    <Employee>
        <name>7</name>
        <name>8</name>
    </Employee>
  </Company>
</Persons>

而且我想捕获每个节点的第一个元素。这里,我想得到 1 和 5

我正在使用此 XPath 来执行此操作:

/Persons/Company//name[1]/text()

但我得到 1,3,5,7

注意:我无法使用 /Persons/Company/Employee[1]//name[1]/text() 因为 Employee 是一个任意标记,我不知道 name 元素实际上位于 Company 元素中的什么位置。

以下 XPath

/Persons/Company//*[1]//name[1]/text()

会select

1
5

根据要求,未明确指定 Employee

注意:您可以将 // 说明符中的一个或两个收紧为 /,具体取决于一般情况下未说明的具体情况. (在测试直接父子关系而不是更一般的自子孙关系时使用 /。)

这对 descendant:: 轴很好用:

/Persons/Company/descendant::name[1]

这是一个很好的例子,说明 //descendant:: 的含义略有不同 - // 的定义是 shorthand /descendant-or-self::node()/ 包括斜杠,所以

/Persons/Company//name[1]

表示

/Persons/Company/descendant-or-self::node()/name[1]

这清楚地表明 [1] 仅适用于最后的子步骤(因此返回每个 name,即其各自父级中的第一个 name),而不适用于整个搜索后代。