如何在集合上运行XPath contains()?

时间:2014-07-11 11:09:20

标签: xml xpath soapui

我有一个XML文档,其结构类似于以下内容:

<list>
  <item>
    <delivery>
      <date>2014-12-31T00:00:00.000Z</date>
      <!-- ... -->
    </delivery>
    <!-- ... -->
  </item>
  <item>
    <delivery>
      <date>2014-12-31T01:10:11.000Z</date>
    </delivery>
  </item>
  <item>
    <delivery>
      <date>2014-12-31T12:30:15.059Z</date>
    </delivery>
  </item>
</list>

我想要做的是检查交货是否在同一天。 我在SoapUI 5(免费的OSS社区版)中所做的是检查以下情况:

contains(/list/item[*]/delivery/date, "2014-12-31")

SoapUI然后抱怨你不能包含()一个集合。很公平。 然后我尝试了

/list/item[*]/delivery/date[contains(., "2014-12-31")]

但这似乎完整地返回了第一个日期:2014-12-31T00:00:00.000Z

那么,我怎样才能在我的收藏中运行一个包含?或者,我如何检查所有交货的天数是否相同?

3 个答案:

答案 0 :(得分:1)

我希望返回<dellivery> <date>值包含特定日期的XPath可以帮助您验证所有投放的日期是否相同

/list/item/delivery[date[contains(., "2014-12-31")]]

我不知道SoapUI所以我只能建议XPath只能解决这个问题:

count(/list/item/delivery[date[not(contains(., "2014-12-31"))]])

如果上面的XPath返回0表示所有日子都相同; 2014-12-31

答案 1 :(得分:1)

XPath无法进行任何类型的循环。正如你所指出的那样,你必须使用计数来伪造它。

你的XPath表达式是:

count(//*:date[text()='${#Response#//*:date}'])

这表示:计算与第一个日期相同的日期数。

您的预期结果将是:

${#Response#count(//*:date)}

这说:计算所有日期的数量。

答案 2 :(得分:1)

  

我想要做的是检查交货是否在同一天

由于你在评论中说你有XPath 2.0可用,那么

怎么样
count(distinct-values(
  for $date in /list/item/delivery/date return substring($date, 1, 10)
)) = 1

换句话说,取每次交货日期和时间的一部分并删除重复项,如果您最后只剩下一项,那么您就知道所有日期都是相同的。