如果属性匹配则选择节点的XPath表达式,否则选择不具有此属性的节点

时间:2013-10-04 12:22:49

标签: xml xpath

考虑以下XML

<xml>
  <tag/>
  <tag version="2.1"/>
</xml>

我想要一个XPath 1.0表达式,如果我搜索版本2.1则返回<tag version="2.1"/>,如果我搜索版本2.2则返回<tag/>

到目前为止,我已经尝试了

/xml/tag[@version = '%version%' or not(@version)]

其中%version%是一个字符串,可以是2.1或2.2,但如果%version%是2.1,则返回两个节点。

2 个答案:

答案 0 :(得分:3)

您可以使用|(或)

来使用此类内容
    /xml[not(tag[@version="2.1"])]/tag[not(@version)] |
    /xml[tag[@version="2.1"]]/tag[@version="2.1"]
  • xmltag没有version="2.1",然后返回tag没有version属性的<{1}}
  • 或者,如果xml包含tag version="2.1",请返回

那就是你的情况

    /xml[not(tag[@version='%version%'])]
        /tag[not(@version)]
    |
    /xml[tag[@version='%version%']]
        /tag[@version='%version%']

答案 1 :(得分:3)

作为xpath 2.0(如果相关)替代非常好的@paul答案,您可以使用

if (/xml/tag[@version = '2.1']) then /xml/tag[@version = '2.1'] else /xml/tag[not(@version)] 

RESP。

if (/xml/tag[@version = '%version%']) then /xml/tag[@version = '%version'] else /xml/tag[not(@version)]