使用xs:extension忽略元素的顺序

Pet*_*ang 15 xml xsd

如何设计我的xsd以忽略元素序列?

<root> <a/> <b/> </root>
Run Code Online (Sandbox Code Playgroud)

<root> <b/> <a/> </root>
Run Code Online (Sandbox Code Playgroud)

我需要使用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>
Run Code Online (Sandbox Code Playgroud)

此xsd无效,但报告以下错误<!-- ERROR -->:

cos-all-limited.1.2:所有模型组必须出现在{min occurrence} = {max occurrence} = 1的粒子中,并且该粒子必须是构成复杂类型的{content type}的对的一部分定义.

cos-all-limited.1.2的文档说:

1.2具有{max occurrence} = 1的粒子的{term}属性,它是构成复杂类型定义的{content type}的对的一部分.

我真的不明白这一点(既不是xsd也不是英语母语:)).


我做错了什么,我做错了什么,或者没有办法实现这个目标?

Bol*_*olo 6

主要编辑最初我错过了你需要使用的要求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"/>
Run Code Online (Sandbox Code Playgroud)


小智 6

以下是限制的解释: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>
Run Code Online (Sandbox Code Playgroud)