如果存在重新出现的元素,则使用XPATH选择不同的第一个元素

时间:2012-11-14 16:29:22

标签: xml xpath

我有一个重复出现的XML元素

<comment>
    <cmnt_reas_typ>reason1</cmnt_reas_typ>
    <cmnt_txt>ABC</cmnt_txt>
</comment>
<comment>
    <cmnt_reas_typ>reason1</cmnt_reas_typ>
    <cmnt_txt>ABC</cmnt_txt>
</comment>
<comment>
    <cmnt_reas_typ>reason2</cmnt_reas_typ>
    <cmnt_txt>ABC</cmnt_txt>
</comment>

基本上,我只想为特定cmnt_txt显示cmnt_reas_typ一次。所以从上面的示例我想只为cmnt_txt =“reason1”显示cmnt_reas_typ“ABC”一次。但问题是cmnt_reas_typ是一个动态值,我无法在XPath中对其进行硬编码。有没有办法说这个cmnt_txt只返回一个cmnt_reas_typ?或者即使XPath返回布尔值true,如果它是cmnt_reas_typ的第二次出现也应该没问题。它适用于XPATH 1.0。

3 个答案:

答案 0 :(得分:0)

在XPATH 2.0上,您可以使用distinct-values()

您预期的XPATH应该是

语法:

distinct-values(//comment[cmnt_reas_typ='PASS-YOUR-DYNAMIC-VALUE']/cmnt_txt)

实施例

distinct-values(//comment[cmnt_reas_typ='reason1']/cmnt_txt)

您将获得独特结果列表,并在屏幕上逐一显示。

答案 1 :(得分:0)

此xpath将仅返回comment个元素,这些元素在XPATH 1.0中为每个cmnt_txt都有唯一的cmnt_reas_type元素

comment[not(. = preceding::comment)]

答案 2 :(得分:0)

如果我理解你的需要,你希望每个评论类型都能产生一个评论文本(第一个),对吗?如果是这样,那么我想出了这个XPath:

//cmnt_txt[not(../cmnt_reas_typ/text() = ../preceding::cmnt_reas_typ/text())]

所有cmnt_text节点的cmnt_reas_typ不等于任何前面的cmnt_reas_typ。因此,如果没有我错过的任何内容,它应该只采用每种类型的第一个cmnt_text