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

XSD validation: Element Value should be sum of 2 other Elements

<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 值的总和?

如果你使用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>

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: Assertion evaluation ('ceu = first_year + second_year') for element 'course' on schema type '#AnonType_course' did not succeed.