Игнорировать порядок элементов, используя расширение xs: - PullRequest
15 голосов
/ 22 апреля 2010

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

<root> <a/> <b/> </root>

<root> <b/> <a/> </root>

Мне нужно использовать extension для генерации кода, поэтому я попробовал следующее, используя all:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://www.example.com/test"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:t="http://www.example.com/test" >

    <xs:complexType name="BaseType">
        <xs:all>
            <xs:element name="a" type="xs:string" />
        </xs:all>
    </xs:complexType>

    <xs:complexType name="ExtendedType">
        <xs:complexContent>
            <xs:extension base="t:BaseType">
                <xs:all> <!-- ERROR -->
                    <xs:element name="b" type="xs:string" />
                </xs:all>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:element name="root" type="t:ExtendedType"></xs:element>
</xs:schema>

Этот xsd недопустим, в <!-- ERROR --> сообщается о следующей ошибке:

cos-all-limited.1.2: Вся группа моделей должна появляться в частице с {min Встречается} = {Макс происходит} = 1, и эта частица должна быть частью пары, которая составляет {тип содержимого} определение сложного типа.

Документация cos-all-limited.1.2 гласит:

1.2 свойство {term} частицы с {max Встречает} = 1, которая является частью пары, которая составляет {тип содержимого} определения сложного типа.

Я не очень понимаю это ( ни xsd, ни носитель английского языка:) ).


Я поступаю неправильно, я поступаю неправильно, или нет способа добиться этого?

Ответы [ 3 ]

6 голосов
/ 12 января 2012

Вот объяснение ограничения: http://marc.info/?l=xerces-j-user&m=118712527901786&w=4

Единственное расширение, которое вы можете сделать для сложного типа с помощью модели "all", - это добавить некоторые атрибуты. Вы не можете расширить с новыми элементами.

В моем случае я сделал что-то подобное:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://www.example.com/test"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:t="http://www.example.com/test" >

    <xs:complexType name="BaseType">
        <xs:all>
            <xs:element name="a" type="xs:string" />
        </xs:all>
    </xs:complexType>

    <xs:complexType name="ExtendedType">
        <xs:all>
            <xs:element name="a" type="xs:string" /> <!-- copy/paste from BaseType -->
            <xs:element name="b" type="xs:string" />
        </xs:all>
    </xs:complexType>

    <xs:element name="root" type="t:ExtendedType"></xs:element>
</xs:schema>
6 голосов
/ 22 апреля 2010

ОСНОВНОЕ РЕДАКТИРОВАНИЕ Первоначально я пропустил требование, которое необходимо использовать xsd:extension. Обратите внимание, что xsd:extension работает так, как если бы было xsd:sequence с содержимым базового типа, за которым следует содержимое расширенного типа. Как выразился в XML Schema Primer:

Когда сложный тип выводится расширение, его эффективная модель контента модель содержимого базового типа плюс модель контента, указанная в тип деривации. Кроме того, две модели контента рассматриваются как две дети последовательной группы.

Следовательно, похоже, что единственный способ выполнить эту работу - это иметь пустой базовый тип и хранить всю альтернативу в расширенном типе или наоборот (все в базовом и пустом расширении). Как это:

<xsd:complexType name="ExtendedType">
   <xsd:complexContent>
      <xsd:extension base="BaseType">
         <xsd:choice>
            <xsd:sequence>
               <xsd:element name="a" type="xsd:string"/>
               <xsd:element name="b" type="xsd:string"/>
            </xsd:sequence>
            <xsd:sequence>
               <xsd:element name="b" type="xsd:string"/>
               <xsd:element name="a" type="xsd:string"/>
            </xsd:sequence>
         </xsd:choice>
      </xsd:extension>
   </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="BaseType"/>

<xsd:element name="root" type="ExtendedType"/>
0 голосов
/ 22 апреля 2010

<xs:complexType name="BaseType"> 
    <xs:sequence> 
        <xs:element name="a" type="xs:string" /> 
    </xs:sequence> 
</xs:complexType> 

<xs:complexType name="ExtendedType"> 
    <xs:complexContent> 
        <xs:extension base="t:BaseType"> 
            <xs:sequence> 
                <xs:element name="b" type="xs:string" /> 
            </xs:sequence> 
        </xs:extension> 
    </xs:complexContent> 
</xs:complexType> 

<xs:element name="root" type="t:ExtendedType"></xs:element> 

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...