2

我有一个如下所示的 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>

建议?

4

2 回答 2

1

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

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


使用

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

这将选择任何元素,该元素是bc并且是作为aXML 文档顶部元素的子元素的任何元素的子元素。

请注意,当前接受的答案不正确:

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

它不仅假设只有一个a顶部元素(实际上不存在),而且给定一个特定的 XML 文档,除了想要的元素之外,它还会选择a作为顶部元素的子元素的任何元素a

我在上面推荐的 XPath 表达式:

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

比其他答案之一中提出的另一个正确的 XPath 表达式更有效:

/a/b | /a/c

这需要分别评估/a/b//a/c然后对两次评估的结果进行集合并集。

我推荐的 XPath 表达式只需要对文档进行一次扫描,不需要联合,即使在流模式下也可以在无限大小的巨大 XML 文档上使用。

于 2012-08-15T02:49:44.717 回答
0

在 XPATH 2.0+ 中,选择 b & c 的最简单表达式是 ...

/a/(b|c)

请注意,在 XPATH 2.0 中,如果您不需要按文档顺序对节点进行排序,您还可以使用 ...

/a/(b,c)

在 XPATH 1.0 中,您需要...

/a/b | /a/c
于 2012-08-15T00:43:41.393 回答