2014-10-22 1 views
1

Я работаю над файлом транзакций покупки. Каждая транзакция может взиматься с одной или нескольких учетных записей и распределяться по одной или нескольким категориям. Например, справедливо следующее:Проверка XML, сравнивающая суммы двух разных типов childnode

<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, так что я не уверен, что на самом деле существует «сумма», или если это правильный синтаксис для него.

ответ

0

Ваш xsd:assert на самом деле правильный, как у вас есть. Просто добавьте его в полный 1.1 XSD, как показано ниже, и вам хорошо идти.

Обратите внимание, что выражения, которые могут использоваться в xsd:assert, являются в основном выражениями XPath 2.0. (Строго говоря, есть подмножество XPath 2.0 выражения, которые могут быть использованы, если вы попали такие граничные условия, вы можете отступить или иногда настроить процессор для обеспечения полного XPath 2.0 выражения в xsd:assert.)

<?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> 
+0

Спасибо. Я не смог выполнить эту работу, и думал, что проблема была синтаксисом утверждения. Теперь, похоже, проблема связана с EditiX. Насколько я понимаю, он не поддерживает xs: assert. {В качестве примечания, я НЕ рекомендую EditiX для новых XML-схем. Это может быть мощным и эффективным в руках тех, кто силен в XML-схеме, но лично я нахожу, что это сообщения об ошибках довольно загадочные.} – Selecter

+0

Если EditiX не принимает вышеуказанный XSD как действительный, то он не поддерживает XSD 1.1, который он должен для поддержки 'xs: assert'. – kjhughes

Смежные вопросы