我正在处理购买交易的文件。 每个交易可以向一个或多个账户收费,并分配给一个或多个类别。 例如,以下内容有效:
<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;实际存在,或者如果这是正确的语法。
答案 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>