【发布时间】:2015-09-02 07:01:03
【问题描述】:
我有一个如下的 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* ,因为真实姓名不匹配。我在这里使用了一个示例。
【问题讨论】:
-
你能改变元素的命名吗?我建议将每个 cdX 元素更改为 cd 元素。
-
我无法控制它。如果是这样,那就很简单了。