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 

这可能吗?

一个正确答案是

 /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/*