基于nodeName的xpath选择

时间:2012-08-14 21:52:30

标签: xml xslt xpath

我有一个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>

建议?

2 个答案:

答案 0 :(得分:1)

首先,请注意您尚未提供格式良好的XML文档。根据定义,格式良好的XML文档必须具有单个顶部元素。

我在这个答案中假设所有a元素都是这个单个顶部元素的子元素,但未在问题中显示。


使用

/*/a/*[self::b or self::c]

这将选择bc的任何元素,并且该元素是任何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