我有以下XML有效负载:
<?xml version="1.0" encoding="UTF-8" ?>
<product>
<discount class="standard">
<id>123</id>
<beginDate>20181205</beginDate>
<endDate>20181225</endDate>
</discount>
<account>12345</account>
</product>
class
元素上的discount
属性可以具有以下值:
standard
special
custom
sale
我正在尝试编写一个XPath表达式,如果该文件具有product/discount
元素且其中一个值为class
,则该表达式将匹配。我的最佳尝试:
/product/discount[@class]/[@class = 'standard' or @class = 'special' or @class = 'customer' or @class = 'sale']
产生以下错误:
InvalidXPathExpression: Invalid xpath: /product/discount[@class]/[@class = 'standard' or @class = 'special' or @class = 'customer' or @class = 'sale']. Reason: javax.xml.xpath.XPathExpressionException: javax.xml.transform.TransformerException: A location step was expected following the '/' or '//' token.
有什么想法可以解决我的XPath问题吗?
答案 0 :(得分:3)
如错误消息所指示,/
之后必须执行定位步骤。因此,/[@class = 'standard' ...]
不是有效的xPath表达式。
相反,请尝试:
/product/discount[@class = 'standard' or @class = 'special' or @class = 'customer' or @class = 'sale']
答案 1 :(得分:1)
只是为了好玩,它的XPath 1.0表达式比@jsheeran更好的答案要短:
/product/discount[@class[.='standard' or .='special' or .='customer' or .='sale']]
如果class
属性是唯一标记,并且某些特殊字符(例如 
)不能包含在其中,那么您可以使用此XPath 1.0 “项目输入序列” 表达式:
/product
/discount[
contains(
' standard special customer sale ',
concat(' ',@class,' ')
)
]