xPath,用于选择两个特定兄弟之间的元素

时间:2014-12-10 08:26:19

标签: xml xpath

我有以下xml,我需要选择只有b" desc"的b'在具有"标题"类型的元素下。

<?xml version="1.0" encoding="UTF-8"?>
<x>
<a>
   <b type="header" text="A." />
</a>
<a>
   <b type="desc" text="A1." />
</a>
<a>
   <b type="desc" text="A2." />
</a>
<a>
   <b type="desc" text="A3." />
</a>
<a>
   <b type="desc" text="A4." />
</a>
<a>
   <b type="header" text="B." />
</a>
<a>
   <b type="desc" text="B1." />
</a>

代码应该是这样的:/x/a/b/[@type='desc']....

输出必须是:

A1.
A2.
A3.
A4.

提前致谢...

3 个答案:

答案 0 :(得分:1)

/x/a/b[@type="header"]/../following-sibling::*[0][name()='a']/b[@type="desc"]/@text

未经测试但您找到标题,返回到a,获取第一个跟随元素,检查它是否为a,然后查找b的子项,键入desc并获取text属性。 /> ......

答案 1 :(得分:1)

您可以尝试这种方式:

/x/a[following-sibling::a[b[@type='header']] and preceding-sibling::a[b[@type='header']]]/b[@type='desc']/@text

答案 2 :(得分:1)

默认情况下,XPath使用子轴,但在这种情况下,您需要检查前面和后面的兄弟。

首先,您需要指定起始a节点。它必须包含b typeheader text的{​​{1}}个节点。

A.

它必须是您要获取的节点的前一个兄弟。

a[b[@type="header" and @text = "A."]]

第二个限制是使用preceding-sibling::a[b[@type="header" and @text = "A."]] type的此节点的第一个兄弟节点:

header

接下来使它成为preceding-sibling::a[b[@type="header" and @text = "A."]]/following-sibling::a[b[@type="header"]][1]节点的条件。因此,您只选择这两者之间的节点:

a

上次使用/x/a[ preceding-sibling::a[b[@type="header" and @text = "A."]] and preceding-sibling::a[b[@type="header" and @text = "A."]]/following-sibling::a[b[@type="header"]][1] ] 属性text

选择b个子节点的type个属性节点
desc