我有一个如下所示的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>有什么建议吗?
发布于 2012-08-15 10:49:45
首先,请注意您没有提供格式良好的文档。根据定义,格式良好的XML文档必须只有一个top元素。
在这个答案中,我假设所有的a 元素都是这个单独的top元素的子元素,这在问题中没有显示出来。
使用的
/*/a/*[self::b or self::c]这将选择任何b或c元素,这些元素是a元素的子元素,而这些元素又是文档顶层元素的子元素。
请注意,当前接受的答案是错误的:
/a/*[self::a or self::b or self::c]它不仅假设只有一个XML元素(实际上并没有),而且给定一个特定的a文档,除了需要的元素之外,它还会选择作为顶级元素a的子元素的任何a元素。
上面我推荐的XPath表达式:
/*/a/*[self::b or self::c]比其他答案中提出的另一个正确的XPath表达式更有效:
/a/b | /a/c这需要分别评估/a/b/和/a/c,然后执行两个评估结果的集合并集。
我推荐的XPath表达式只需要对文档进行一次扫描,不需要联合,甚至可以在流模式下用于无限大小的大型XML文档。
发布于 2012-08-15 08:43:41
在XPATH 2.0+中,选择b&c的最简单表达式是...
/a/(b|c)请注意,在XPath2.0中,如果不需要按文档顺序对节点进行排序,还可以使用...
/a/(b,c)在XPATH 1.0中,您将需要...
/a/b | /a/chttps://stackoverflow.com/questions/11961364
复制相似问题