xsd-断言条件检查所有后代

时间:2018-12-12 11:24:47

标签: validation xsd assert xsd-1.1

我有以下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文件,在该文件中我想添加一个条件,该条件检查以下内容:如果“支付”了该制度,则任何priceInPercents都不能为“ 0”,除非该特定数据中的Discount元素元素为“ true”。 (政权的可能价值只有“支付”或“免费”)。我正在尝试通过以下方式在请求级别使用assert:

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

在这种情况下,验证者说是可以的,因为在第二种情况下满足了条件的第二部分,而在第一种情况下满足了第三部分。第三种情况不符合任何条件,但没有关系,因为assert已经找到了匹配项。我需要重写XPath来检查所有数据元素的模式,但是我真的不知道该怎么做。

1 个答案:

答案 0 :(得分:0)

如果我对您的理解正确,那么您要强制执行的条件是在给定请求中,要么是

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

处理此问题的一种方法是反转第二个主要析取项的布尔极性,并说“ datapriceInPercents eq '0' and discount eq 'false'都没有<assert test="./resource/regime eq 'free' or not(./user/contract /data[discount eq 'false' and priceInPercents eq 0])"/> 元素。您可以这样说:

every ... satisfies ...

如果使用通用量化表达式,可能会更容易理解;它们采用<assert test="./resource/regime = 'free' or every $d in ./user/contract/data satisfies ($d/discount eq 'true' or $d/priceInPercents ne 0)"/> 的形式。在这种情况下,一种可能的说法是:

function changer(){
        $("#car_brand").change(function(){
            document.getElementById("car_model").value = "ALL";
            this.form.submit()
        });}