鉴于这种简化的数据格式:
<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>
Run Code Online (Sandbox Code Playgroud)
你会如何选择所有元素的Cs,Ds和Es B?
基本上,像:
a/b/(c|d|e)
Run Code Online (Sandbox Code Playgroud)
在我自己的情况,而不是只a/b/,查询导致到选择那些C,D,E节点其实是相当复杂的,所以我想避免这样做:
a/b/c|a/b/d|a/b/e
Run Code Online (Sandbox Code Playgroud)
这可能吗?
Dim*_*hev 194
一个正确的答案是:
/a/b/*[self::c or self::d or self::e]
Run Code Online (Sandbox Code Playgroud)
请注意这一点
a/b/*[local-name()='c' or local-name()='d' or local-name()='e']
Run Code Online (Sandbox Code Playgroud)
既太长又不正确.此XPath表达式将选择以下节点:
OhMy:c
NotWanted:d
QuiteDifferent:e
Run Code Online (Sandbox Code Playgroud)
ann*_*ata 43
您可以使用属性测试来避免重复:
a/b/*[local-name()='c' or local-name()='d' or local-name()='e']
Run Code Online (Sandbox Code Playgroud)
与Dimitre的对立观点相反,上述情况并非真实,其中OP尚未指定与名称空间的交互.该self::轴是命名空间限制性的,local-name()是没有的.如果OP的意图是捕获c|d|e而不管命名空间(我建议甚至可能是针对问题的OR性质的情况)那么它是"另一个仍有一些积极投票的答案",这是不正确的.
如果没有定义,你就无法确定,但如果OP澄清他的问题使我不正确,我很乐意将我的答案删除为真的不正确.
Pav*_*pin 14
为什么不a/b/(c|d|e)呢?我刚刚尝试使用Saxon 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>>)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
119158 次 |
| 最近记录: |