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
元素的所有C
, D
和E
?
基本上是这样的:
a/b/(c|d|e)
在我自己的情况下,导致selectC
, D
, E
节点的查询实际上相当复杂,所以我想避免这样做:
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/*