XPathselect多个标签

鉴于这种简化的数据格式:

<a> <b> <c>C1</c> <d>D1</d> <e>E1</e> <f>don't select this one</f> </b> <b> <c>C2</c> <d>D2</d> <e>E1</e> <g>don't select me</g> </b> <c>not this one</c> <d>nor this one</d> <e>definitely not this one</e> </a> 

你会如何selectB元素的所有CDE

基本上是这样的:

 a/b/(c|d|e) 

在我自己的情况下,导致selectCDE节点的查询实际上相当复杂,所以我想避免这样做:

 a/b/c|a/b/d|a/b/e 

这可能吗?

4 Solutions collect form web for “XPathselect多个标签”

一个正确答案是

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

请注意这一点

 a/b/*[local-name()='c' or local-name()='d' or local-name()='e'] 

是太长和不正确​​的 。 这个XPathexpression式将select如下节点:

 OhMy:c NotWanted:d QuiteDifferent:e 

您可以使用属性testing来避免重复:

 a/b/*[local-name()='c' or local-name()='d' or local-name()='e'] 

与Dimitre的反对意见相反,在OP没有指定与命名空间的交互的真空中,上述情况并不正确self:: axis是命名空间的限制, local-name()不是。 如果OP的意图是捕获c|d|e而不考虑命名空间(我认为这是考虑到OR问题的可能情况),那么“另一个答案仍然有一些积极的选票”,这是不正确的。

如果没有定义,你不可能是确定性的,尽pipe如果OP澄清他的问题使我不正确,我很乐意删除我的答案。

为什么不是a/b/(c|d|e) ? 我只是试着用撒克逊XML库 (用Clojure的一些善良包装起来),它似乎工作。 abc.xml是OP描述的文档。

 (require '[saxon :as xml]) (def abc-doc (xml/compile-xml (slurp "abc.xml"))) (xml/query "a/b/(c|d|e)" abc-doc) => (#<XdmNode <c>C1</c>> #<XdmNode <d>D1</d>> #<XdmNode <e>E1</e>> #<XdmNode <c>C2</c>> #<XdmNode <d>D2</d>> #<XdmNode <e>E1</e>>) 

不知道这是否有帮助,但与XSL,我会做这样的事情:

 <xsl:for-each select="a/b"> <xsl:value-of select="c"/> <xsl:value-of select="d"/> <xsl:value-of select="e"/> </xsl:for-each> 

而不是这个XPathselectB节点的所有子节点:

 a/b/* 
  • XPath OR运算符用于不同的节点
  • 如何使用Xpath检索XML文件中的命名空间
  • JavaScript中的跨浏览器XPath实现
  • 不区分大小写xpath contains()可能吗?
  • xpath:获取没有X祖先的节点
  • XPath:点与文本的区别()
  • XSL if else条件
  • XPath与正则expression式匹配的属性值
  • Javascript获得一个节点的XPath
  • 具有多个条件的XPath
  • 有没有JSON等同于XQuery / XPath?