0

考虑以下 XML

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

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

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

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

where%version%是一个可以是 2.1 或 2.2 的字符串,但如果%version%是 2.1,它会返回两个节点。

4

2 回答 2

3

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

    /xml[not(tag[@version="2.1"])]/tag[not(@version)] |
    /xml[tag[@version="2.1"]]/tag[@version="2.1"]
  • 要么xml没有tags with version="2.1",然后返回不带属性tag的 sversion
  • 或者,如果xml确实包含tags 和version="2.1",则返回这些

所以这就是你的情况

    /xml[not(tag[@version='%version%'])]
        /tag[not(@version)]
    |
    /xml[tag[@version='%version%']]
        /tag[@version='%version%']
于 2013-10-04T12:55:00.950 回答
3

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

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

分别

if (/xml/tag[@version = '%version%']) then /xml/tag[@version = '%version'] else /xml/tag[not(@version)] 
于 2013-10-04T13:08:06.193 回答