2014-09-23 2 views
5

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

<Transactions> 
<Transaction OrderID="5"> ... </Transaction> 
<Transaction OrderID="6"> ... </Transaction> 
<Transaction OrderID="11"> ... </Transaction> 
<Transaction OrderID="7"> ... </Transaction> 
</Transactions> 

Использование XML-схемы, можно указать, что приказ № 11 не в правильной последовательности? Каждый элемент транзакции индивидуально проходит проверку, но OrderID должен быть в порядке возрастания.

И, связанный с этим вопрос: Может ли правило проверки указать, можно ли пропущать числа? Например, нет сделки # 8,9 или 10.

ответ

1

Если валидатор поддерживает XSD 1.1, вы можете использовать хз: утверждать, отрицать определенные значения атрибута, как это:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" 
      elementFormDefault="qualified" 
      attributeFormDefault="unqualified" 
      vc:minVersion="1.1"> 
    <xs:element name="Transactions"> 
     <xs:complexType> 
     <xs:sequence> 
      <xs:element name="Transaction" maxOccurs="unbounded"> 
       <xs:complexType mixed="true"> 
        <xs:attribute name="OrderID" type="xs:integer"/> 
        <xs:assert test="empty(index-of((8,9,10),@OrderID))"/> 
       </xs:complexType>         
      </xs:element> 
     </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

Это должно ответьте на второй вопрос.

Что касается вашего первого вопроса, я не думаю, что проверка заказа возможна. Однако вы можете использовать XSLT для сортировки XML-документа.

----- добавлен ответ на первый вопрос -----

Спасибо, Майкл Кей. Ну ... вот ответ на ваш первый вопрос.

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="Transactions"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="Transaction" maxOccurs="unbounded"> 
        <xs:complexType mixed="true"> 
         <xs:attribute name="OrderID" type="xs:integer"/> 
         <xs:assert test="empty(index-of((8,9,10),@OrderID))"/> 
        </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
      <xs:assert test="every $x in Transaction satisfies 
          (empty($x/preceding-sibling::*) or 
          ($x/@OrderID gt $x/preceding-sibling::*[1]/@OrderID))"/> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 
+2

Да, подтверждение заказа возможно. Например, '' –

+0

Спасибо Чонг Лип Пханг. Честно говоря, я не понимаю ваш ответ достаточно хорошо, чтобы узнать, решает ли он мою проблему или нет. Когда вы написали предположительно, 8,9,10 относятся к определенным значениям OrderID? Файл, над которым я работаю, содержит около 30 тыс. Транзакций. Любой метод, который работает для меня, должен работать без ссылки на определенные значения для OrderID. Второй тест Selecter

+0

Да, приведет к сбою проверки, если значение OrderID равно 8,9 или 10. Если XML-данных много, тогда вам, вероятно, понадобится правило для соответствия определенному шаблону. Проверка будет продолжаться, если вы опустите это правило утверждения, а OrderID пропустит 8,9 или 10. –

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