XSD使用不按特定顺序排列的xs:group元素

时间:2017-01-26 07:18:54

标签: xml xsd

我有以下xml结构

<library>
  <propertySet>
    <SUPorganisationId></SUPorganisationId>
    <SUPdataCategory></SUPdataCategory>
    <SUPguId></SUPguId>
    <LIBuserNotice></LIBuserNotice>
  </propertySet>
</library>

propertySet 中的属性可以出现一次(minOccurs =“0”maxOccurs =“1”),可以是任何顺序。当我创建XSD时,我想将一些属性(前缀为SUP)分组以供进一步使用。所以我提出了以下xsd段。

<xs:element name="propertySet">
  <xs:complexType>
    <xs:all>
      <xs:group ref="CORproperties"/>
      <xs:element name="LIBuserNotice" type="xs:string" minOccurs="0" maxOccurs="1"/>
    </xs:all>
  </xs:complexType>
<xs:element name="propertySet">

<xs:group name="CORproperties">
  <xs:all>
    <xs:element name="SUPorganisationId" type="xs:integer" minOccurs="0" maxOccurs="1"/>
    <xs:element name="SUPdataCategory" type="xs:integer" minOccurs="0" maxOccurs="1"/>
    <xs:element name="SUPguId" type="xs:string" minOccurs="0" maxOccurs="1"/>
  </xs:all>
</xs:group>

有了这个xsd,我收到的错误是 xs:all 的使用不正确。我被迫使用 xs:all ,因为没有出现属性的顺序。但是如果我使用 xs:sequence ,它可以正常工作。有人可以指引我走正确的道路吗?

2 个答案:

答案 0 :(得分:1)

您可以使用<xs:extension>来执行此操作。如果您以这种方式重构架构,它将正常工作:

警告:它仅在XSD 1.1中可用。在XSD 1.0中,不允许使用。

<xs:element name="propertySet">
    <xs:complexType>
     <xs:complexContent>
         <xs:extension base="CORProperties">
             <xs:all>
                 <xs:element name="LIBuserNotice" type="xs:string" minOccurs="0" maxOccurs="1"/>
             </xs:all>
         </xs:extension>
     </xs:complexContent>
    </xs:complexType>
</xs:element>

<xs:complexType name="CORProperties">
    <xs:all>
        <xs:element name="SUPorganisationId" type="xs:integer" minOccurs="0" maxOccurs="1"/>
        <xs:element name="SUPdataCategory" type="xs:integer" minOccurs="0" maxOccurs="1"/>
        <xs:element name="SUPguId" type="xs:string" minOccurs="0" maxOccurs="1"/>
    </xs:all>
</xs:complexType>

答案 1 :(得分:0)

xs:all的注释中,我们发现它不能拥有群组:

<all
   id = ID
   maxOccurs = 1 : 1
   minOccurs = (0 | 1) : 1
   {any attributes with non-schema namespace . . .}>
   Content: (annotation?, element*)
</all>

解决方法一:将组更改为complexType

当然,这会改变你的xml的结构,但这种方式比第二种方式更具可读性。

解决方法二:接受重复

<xs:element name="propertySet">
    <xs:complexType>
        <xs:choice maxOccurs="unbounded">
            <xs:group ref="CORproperties"/>
            <xs:element name="LIBuserNotice" type="xs:string" minOccurs="0" maxOccurs="1"/>
        </xs:choice>
    </xs:complexType>
</xs:element>

<xs:group name="CORproperties">
    <xs:choice maxOccurs="unbounded">
        <xs:element name="SUPorganisationId" type="xs:integer" minOccurs="0" maxOccurs="1"/>
        <xs:element name="SUPdataCategory" type="xs:integer" minOccurs="0" maxOccurs="1"/>
        <xs:element name="SUPguId" type="xs:string" minOccurs="0" maxOccurs="1"/>
    </xs:choice>
</xs:group>

更多: