首页 文章

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

提问于
浏览
0

考虑以下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 回答

  • 3

    你可以使用 | (或)这样的东西

    /xml[not(tag[@version="2.1"])]/tag[not(@version)] |
        /xml[tag[@version="2.1"]]/tag[@version="2.1"]
    
    • 要么 xml 没有带有 version="2.1"tag ,那么返回没有 version 属性的 tag

    • 或者,如果 xml 确实包含带有 version="2.1"tag ,则返回这些

    那就是你的情况

    /xml[not(tag[@version='%version%'])]
            /tag[not(@version)]
        |
        /xml[tag[@version='%version%']]
            /tag[@version='%version%']
    
  • 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)]
    

相关问题