我有一个如下的 XML:
<object>
<codes>
<cd1>A</cd1>
<cd2>B</cd2>
<cd3>C</cd3>
</codes>
<codes>
<cd1>A</cd1>
<cd2>D</cd2>
<cd3></cd3>
</codes>
<codes>
<cd1>E</cd1>
<cd2>D</cd2>
<cd3></cd3>
</codes>
</object>
到目前为止,我的 XPath 演变如下:
//cd1|//cd2|//cd3
: 获取所有 cd1、cd2 和 cd3 元素(//cd1|//cd2|//cd3)[text()[1]]
:从上面的列表中过滤所有具有非空文本值的元素并返回下面的元素。<cd1>A</cd1> <cd2>B</cd2> <cd3>C</cd3> <cd1>A</cd1> <cd2>D</cd2> <cd1>E</cd1> <cd2>D</cd2>
现在我需要删除具有重复文本值的元素。我试过 xpath 作为
(//cd1|//cd2|//cd3)[text()[1]][(preceding::cd1)|(preceding::cd2)|(preceding::cd3)]
. 我希望实现的是检查该值是否在上面的任何 cd1 或 cd2 或 cd3 中。但这会在<cd2>D</cd2>
重复的地方返回。<cd2>B</cd2> <cd3>C</cd3> <cd1>A</cd1> <cd2>D</cd2> <cd1>E</cd1> <cd2>D</cd2>
如何编写 xpath 来解决上述 (3) 问题?
请注意我必须使用 Xpath 1.0 ,因此 distinct-values 函数不是一个选项。此外,我需要获取匹配的节点列表,而不是来自 xpath 的文本值,因为我必须使用 AXIOM 对这些节点进行更多处理。
更新:我正在使用这个 xpath 来获取匹配的元素,然后用 AXIOM 处理这些元素。因此,我需要编写一个 xpath 表达式来一次性获取匹配的元素(我无法在 AXIOM 中编写自定义流程或使用 XSLT)。也不能使用 cd* ,因为真实姓名不匹配。我在这里使用了一个示例。