Проверка XML с использованием xsd на основе условий в полях XML

у меня есть XML

<order>
<details type = "Edit" header = "OK" value ="1">
<details type = "Edit" header = "NOK" value ="1">
<details type = "Edit" header = "Reject" value ="1">
<details type = "Edit" header = "Accept" value ="1">
</order>

Можно ли выполнить условную проверку с помощью XSD? Пример.

*If
 header = "OK"  and value= "1"  
 header = "NOK" and value= "0"
 then  XML Valid
*If
 header = "OK"  and value= "1"  
 header = "NOK" and value= "1"
 then  XML Valid
*If
 header = "OK"  and value= "0"  
 header = "NOK" and value= "1"
 then  XML Valid

Если заголовок = "ОК" и значение = "0"
заголовок = "NOK" и значение = "0" то XML недействителен

Возможна ли такая проверка с использованием XML-схемы?


person Jubish Kammily    schedule 03.06.2015    source источник


Ответы (1)


Вы можете использовать узел xs:assert в своем complexType, чтобы вы могли выполнить запрос xpath 2.0 внутри вашего файла xsd. Это работает только с XSD 1.1

пример для вашего первого теста:

   <xs:element name="order">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="details" minOccurs="1" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="details">
    <xs:complexType>
      <xs:attribute name="type" type="xs:string" use="required"/>
      <xs:attribute name="header" type="xs:string" use="required"/>
      <xs:attribute name="value" type="xs:integer" use="required"/>
      <xs:assert test="((@header = 'OK') and (@value = 1)) and (./following-sibling::details/@header = 'NOK' and ./following-sibling::details/@value eq 0 )/>
      <xs:assert test="...."/>
      <xs:assert test="..."/>
    </xs:complexType>
  </xs:element>

Я не совсем уверен в следующем брате, хотя

person flafoux    schedule 03.06.2015