我有以下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.
提前致谢...
答案 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
type
和header
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