2010-04-22 3 views
15

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

<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-все-limited.1.2: все модели группа должна появиться в частицах с {мин происходит} = {макс происходит} = 1, и что частица должна быть частью пары, которая представляет собой {тип содержимого} определения сложного типа.

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

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

Я не очень понимаю, это (ни XSD, ни английский НОСИТЕЛЕМ :)).


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

ответ

6

MAJOR EDIT Первоначально я пропустил требование, которое вам нужно использовать 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

@Peter Да, я пропустил эту часть. Вот обновление. – Bolo

+0

Спасибо за ваше обновление. К сожалению, мне нужно определить некоторые элементы в базовом типе, а некоторые в расширенном, поэтому, если нет другого способа, элементы расширенного типа всегда должны быть размещены после элементов базового типа ... –

+0

@Peter В этом случае, поскольку «две модели контента рассматриваются как два дочерних элемента последовательной группы», нет способа (насколько я могу видеть) игнорировать последовательность. – Bolo

-3

<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> 

+0

@Ruslan: Вы пробовали это? Он будет обеспечивать последовательность 'a' перед' b', поэтому он на самом деле не помогает мне ... –

6

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

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

В моем случае я сделал что-то вроде этого:

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