断言条件检查所有子体



我有以下xml:

<request>
<resource>
<regime>payed</regime>
</resource>
<user>
<contract>
<data>
<discount>true</discount>
<priceInPercents>0</priceInPercents>
</data>
<data>
<discount>false</discount>
<priceInPercents>20</priceInPercents>
</data>
<data>
<discount>false</discount>
<priceInPercents>0</priceInPercents>
</data>
</contract>
</user>
</request>

XML遵循一个XSD文件,我想在其中添加一个条件,该条件检查以下内容:如果制度是"payed",则任何priceInPercents都不能为"0",除非该特定数据元素中的折扣元素为"true"。(政权的可能值仅为"付费"或"免费"(。我正试图通过以下方式在请求级别上使用断言来做到这一点:

<assert test="./resource/regime/text() = 'free' 
or ./user/contract
/data[discount=false]
/priceInPercents != 0 
or ./user/contract
/data[priceInPercents = 0]
/discount = true "/>

在这种情况下,验证器说它是OK的,因为条件的第二部分在第二种情况下得到满足,而第三部分在第一种情况下被填满。第三种情况与任何条件都不匹配,但这并不重要,因为assert已经找到了匹配项。我需要重写XPath来检查所有数据元素的模式,但我真的不知道该怎么做。

如果我正确理解你,你想强制执行的条件是在给定的请求中

  • resource/regime eq 'free',或
  • 对于每个user/contract/data元素
    • priceInPercents为非零,或
    • discount eq 'true'

处理这一问题的一种方法是反转第二个主析取的布尔极性,并说"没有data元素同时具有priceInPercents eq '0' and discount eq 'false'。你可以这样说:

<assert test="./resource/regime eq 'free' 
or not(./user/contract
/data[discount eq 'false' and priceInPercents eq 0])"/>

如果你使用一个普遍量化的表达式,可能会更容易理解;它们采用CCD_ 7的形式。在这种情况下,一种可能的公式是:

<assert test="./resource/regime = 'free' 
or every $d in ./user/contract/data
satisfies
($d/discount eq 'true' 
or $d/priceInPercents ne 0)"/>

最新更新