首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于nodeName的xpath选择

基于nodeName的xpath选择
EN

Stack Overflow用户
提问于 2012-08-15 05:52:30
回答 2查看 782关注 0票数 2

我有一个如下所示的XML,我只想在xslt中使用xpath过滤选择"a“的子元素"b”和"c“

代码语言:javascript
复制
<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>

有什么建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-15 10:49:45

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

在这个答案中,我假设所有的a 元素都是这个单独的top元素的子元素,这在问题中没有显示出来。

使用的

代码语言:javascript
复制
/*/a/*[self::b or self::c]

这将选择任何bc元素,这些元素是a元素的子元素,而这些元素又是文档顶层元素的子元素。

请注意,当前接受的答案是错误的:

代码语言:javascript
复制
/a/*[self::a or self::b or self::c]

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

上面我推荐的XPath表达式:

代码语言:javascript
复制
/*/a/*[self::b or self::c]

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

代码语言:javascript
复制
/a/b | /a/c

这需要分别评估/a/b//a/c,然后执行两个评估结果的集合并集。

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

票数 1
EN

Stack Overflow用户

发布于 2012-08-15 08:43:41

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

代码语言:javascript
复制
/a/(b|c)

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

代码语言:javascript
复制
/a/(b,c)

在XPATH 1.0中,您将需要...

代码语言:javascript
复制
/a/b | /a/c
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11961364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档