我有一个XML如下所示,我想在xslt
中使用xpath过滤选择“a”元素“b”和“c”子元素<a>
<b>data_1</b>
<c>data_1</c>
<d>data_1</d>
<e>data_1</d>
</a>
<a>
<b>data_2</b>
<c>data_2</c>
<d>data_2</d>
<e>data_2</d>
</a>
<a>
<b>data_3</b>
<c>data_3</c>
<d>data_3</d>
<e>data_3</d>
</a>
建议?
答案 0 :(得分:1)
首先,请注意您尚未提供格式良好的XML文档。根据定义,格式良好的XML文档必须具有单个顶部元素。
我在这个答案中假设所有a
元素都是这个单个顶部元素的子元素,但未在问题中显示。
使用强>:
/*/a/*[self::b or self::c]
这将选择b
或c
的任何元素,并且该元素是任何a
元素的子元素,它是XML文档顶部元素的子元素。
请注意当前接受的答案不正确:
/a/*[self::a or self::b or self::c]
不仅假设有一个a
顶级元素(并且没有这样的元素),但是给定一个特定的XML文档,除了所需的元素之外,它还会选择任何{{1} }元素是顶部元素a
的子元素。
我推荐的XPath表达式:
a
比另一个更有效,正确的XPath表达式在其他一个答案中提出:
/*/a/*[self::b or self::c]
这需要单独评估/a/b | /a/c
和/a/b/
,然后执行两次评估结果的集合。
我推荐的XPath表达式只需要对文档进行一次扫描,不需要联合,甚至可以在无限大小的XML文档中以流模式使用。
答案 1 :(得分:0)
在XPATH 2.0+中,选择b&amp;的最简单表达式c是......
/a/(b|c)
请注意,在XPATH 2.0中,如果您不需要按文档顺序排序节点,也可以使用...
/a/(b,c)
在XPATH 1.0中,您需要......
/a/b | /a/c