XSD验证:元素值应该是其他2个元素的总和

时间:2015-10-15 16:42:58

标签: xml xsd xsd-validation

<xml>
   <root>
     <courses>
         <course>
             <ceu>2000</ceu>
             <first_year>1000</first_year>
             <second_year>1000</first_year>
         </course>
     </courses>
   </root>

如何添加XSD验证,以便元素CEU的值始终等于first_year和second_year值的总和?

2 个答案:

答案 0 :(得分:1)

如果您使用xsd 1.1,则可以使用xs:assert

<xs:element name="course">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="ceu" type="xs:positiveInteger"/>
            <xs:element name="first_year" type="xs:positiveInteger"/>
            <xs:element name="second_year" type="xs:positiveInteger"/>
        </xs:sequence>
        <xs:assert test="ceu = sum((first_year,second_year))"/>
    </xs:complexType>
</xs:element>

答案 1 :(得分:1)

XSD 1.0

不可能。

XSD 1.1

此XML文件有效:

<course>
  <ceu>3000</ceu>
  <first_year>1000</first_year>
  <second_year>2000</second_year>
</course>

使用此XSD:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1">
  <xs:element name="course">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="ceu" type="xs:positiveInteger"/>
        <xs:element name="first_year" type="xs:positiveInteger"/>
        <xs:element name="second_year" type="xs:positiveInteger"/>
      </xs:sequence>
      <xs:assert test="ceu = first_year + second_year"/>
    </xs:complexType>
  </xs:element>
</xs:schema>

但是这个XML:

<course>
  <ceu>4000</ceu>
  <first_year>1000</first_year>
  <second_year>2000</second_year>
</course>

将违反断言并导致错误消息,如下所示:

  

cvc-assertion:断言评估(&#39; ceu = first_year +   second_year&#39;)for element&#39; course&#39;在架构类型&#39;#AnonType_course&#39;   没有成功。