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

时间:2015-03-10 11:12:31

标签: xml 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元素中的哪个位置。

2 个答案:

答案 0 :(得分:1)

这适用于descendant::轴:

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

这是//descendant::意味着略有不同的事例的一个很好的例子 - //的定义是它是/descendant-or-self::node()/的简写,包括斜线,所以

/Persons/Company//name[1]

装置

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

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

答案 1 :(得分:0)

以下XPath

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

将选择

1
5

按要求明确指定Employee

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