XML验证比较两种不同类型的子节点的总和

时间:2014-10-22 10:25:14

标签: xml xsd

我正在处理购买交易的文件。 每个交易可以向一个或多个账户收费,并分配给一个或多个类别。 例如,以下内容有效:

<Purchase ID="1000" Date="2014-10-22">
   <AccountCharge Account="CreditVoucher">40</AccountCharge>
   <AccountCharge Account="Visa">160</AccountCharge>
   <CategoryCharge Category="Repair">150</CategoryCharge>
   <CategoryCharge Category="Parts">20</CategoryCharge>
   <CategoryCharge Category="Labour">30</CategoryCharge>
</Purchase>

这是有效的,因为AccountCharges的总和= 200,而且CategoryCharges的总和= 200。

使用XSD,如何表达这一规则?

我认为它接近:

<xs:assert test="sum(AccountCharge)=sum(CategoryCharge)" />

我无法找到可以在XSD中使用哪些功能的列表,所以我不确定是否&#39;总结&#39;实际存在,或者如果这是正确的语法。

1 个答案:

答案 0 :(得分:0)

你的xsd:assert实际上是正确的。只需将其添加到完整的1.1 XSD中,如下所示,您就可以了。

请注意,xsd:assert中可以使用的表达式基本上是XPath 2.0表达式。 (严格地说,可以使用XPath 2.0表达式的子集;如果遇到这样的边界条件,您可以撤回或有时配置处理器以允许xsd:assert中的完整XPath 2.0表达式。)< / p>

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
    xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1">
  <xs:element name="Purchase">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="AccountCharge" maxOccurs="unbounded">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="xs:integer">
                <xs:attribute name="Account"/>
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>
        <xs:element name="CategoryCharge" maxOccurs="unbounded">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="xs:integer">
                <xs:attribute name="Category"/>
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
      <xs:attribute name="ID"/>
      <xs:attribute name="Date"/>
      <xs:assert test="sum(AccountCharge)=sum(CategoryCharge)" />
    </xs:complexType>
  </xs:element>
</xs:schema>
相关问题