2017-01-11 6 views
2

В настоящее время у меня есть файл XSD, который контролирует проверку и т. Д. В соответствии с моим соответствующим XML-файлом, и я хотел бы управлять (желательно с использованием команды assert, а не XLST [поскольку у меня нет прежних знаний это]) и быть в состоянии обеспечить наличие одинакового количества а: теги Страны на а: ACCOUNTNUMBER теги, а один должны соответствовать другомуXSD 1.1 Ассемблер для подсчета и сравнения элементов

<abc:Account> 
     <abc:Individual> 
     <abc:Country>Germany</abc:Country> 
     <abc:Country>Australia</abc:Country> 
     <abs:AccountNumber issuedBy="DE">123456</abs:AccountNumber> 
     <abs:AccountNumber issuedBy="AU">654321</abs:AccountNumber> 
     </abc:Individual> 
    </abc:Account> 

Пожалуйста, могут кто-то помочь мне с командой утверждать, я может использовать выполнить эту проверку?

Я попытался следующие без толку ...

<xsd:assert test="if (count (abc:Account/abc:Individual/abc:Country) eq (count (abc:Account/abc:Individual/AccountNumber))) then true() else false() "/> 

или это ....

<xsd:assert test="count (abc:Account/abc:Individual/abc:Country) eq count (abc:Account/abc:Individual/AccountNumber)"/> 

Я полагаю, что это выполнимо с помощью XSD 1.1?

любая помощь будет принята с благодарностью .... спасибо

ответ

1

Я думаю, что это имеет больше смысла иметь уверенно утверждать, определение типа для abc:Individual элемента, то утверждают, это просто:

count(abc:Country) eq count(abc:AccountNumber) 

Полная схема выглядит так. Для простоты я сохранил AccountNumber в пространстве имен abc, но в противном случае его можно легко заменить ссылкой.

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:abc="http://www.example.com/abc" 
    targetNamespace="http://www.example.com/abc" 
    xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" 
    vc:minVersion="1.1"> 
    <xs:element name="Account"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="abc:Individual" maxOccurs="unbounded" /> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="Individual"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="abc:Country" maxOccurs="unbounded" /> 
       <xs:element ref="abc:AccountNumber" maxOccurs="unbounded" /> 
      </xs:sequence> 
      <xs:assert test="count(abc:Country) eq count(abc:AccountNumber)"/> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="Country" type="xs:string"/> 
    <xs:element name="AccountNumber"> 
     <xs:complexType> 
      <xs:simpleContent> 
       <xs:extension base="xs:string"> 
        <xs:attribute name="issuedBy" type="xs:string"/> 
       </xs:extension> 
      </xs:simpleContent> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

Помимо изменения abs в abc, первоначальный документ успешно проверен на соответствие схеме, т.е .:

<?xml version="1.0" encoding="UTF-8"?> 
<abc:Account 
    xmlns:abc="http://www.example.com/abc" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.example.com/abc test.xsd"> 
    <abc:Individual> 
     <abc:Country>Germany</abc:Country> 
     <abc:Country>Australia</abc:Country> 
     <abc:AccountNumber issuedBy="DE">123456</abc:AccountNumber> 
     <abc:AccountNumber issuedBy="AU">654321</abc:AccountNumber> 
    </abc:Individual> 
</abc:Account> 
+0

Ghislain Fourny спасибо очень много! Быстрый и лаконичный ответ, работал так, как я этого хотел! Спасибо!!! :) –