在xsd中的多个位置具有相同的数据

时间:2013-09-18 23:04:08

标签: xml xsd

所以,我有一个.xsd文件,里面有很多重复。

<xs:complexType name="Square">
  <xs:sequence>
    <xs:element name="Side1" type="xs:integer" minOccurs="1"/>
    <xs:element name="Side2" type="xs:integer" minOccurs="1"/>
    <xs:element name="Side3" type="xs:integer" minOccurs="1"/>
  <xs:element name="Side4" type="xs:integer" minOccurs="1"/>
  </xs:sequence>
  <xs:attribute name="squarename" type="xs:string" use="optional" />
  <xs:attribute name="squarenumber" type="xs:integer" use="optional" />
</xs:complexType>

<xs:complexType name="Rectangle">
  <xs:sequence>
    <xs:element name="Side1" type="xs:integer" minOccurs="1"/>
    <xs:element name="Side2" type="xs:integer" minOccurs="1"/>
    <xs:element name="Side3" type="xs:integer" minOccurs="1"/>
    <xs:element name="Side4" type="xs:integer" minOccurs="1"/>
  </xs:sequence>
  <xs:attribute name="rectanglecolor" type="xs:string" use="optional" />
  <xs:attribute name="rectanglelabel" type="xs:string" use="optional" />
</xs:complexType>

<xs:complexType name="Rhombus">
  <xs:sequence>
    <xs:element name="Side1" type="xs:integer" minOccurs="1"/>
    <xs:element name="Side2" type="xs:integer" minOccurs="1"/>
    <xs:element name="Side3" type="xs:integer" minOccurs="1"/>
    <xs:element name="Side4" type="xs:integer" minOccurs="1"/>
  </xs:sequence>
  <xs:attribute name="rhombosdance" type="xs:string" use="optional" />
  <xs:attribute name="rhombusname" type="xs:string" use="optional" />
</xs:complexType>

请注意

  <xs:sequence>
    <xs:element name="Side1" type="xs:integer" minOccurs="1"/>
    <xs:element name="Side2" type="xs:integer" minOccurs="1"/>
    <xs:element name="Side3" type="xs:integer" minOccurs="1"/>
    <xs:element name="Side4" type="xs:integer" minOccurs="1"/>
  </xs:sequence>

出现在很多地方。

这看起来有点糟糕。是否有任何方法可以使用占位符或该序列的某些内容。我会创建一个包含所有这些的新类型,但我需要保持向后兼容性,所以我需要xsd采用它能够使用的相同xml,所以我不能转为

<Square>
  <Side1>1</Side1>
  <Side2>1</Side2>
  <Side3>1</Side3>
  <Side3>1</Side3>
</Square>

<Square>
  <QuadSides>
    <Side1>1</Side1>
    <Side2>1</Side2>
    <Side3>1</Side3>
    <Side4>1</Side4>
  <QuadSides>
</Square>

我还需要接受第一个xml。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:1)

另一种方法是使用元素组 (使用<xs:group>元素声明的XSD组件)。

以下是如何重写这个XML模式:

<xs:group name="Sides">
  <xs:sequence>
    <xs:element name="Side1" type="xs:integer" minOccurs="1"/>
    <xs:element name="Side2" type="xs:integer" minOccurs="1"/>
    <xs:element name="Side3" type="xs:integer" minOccurs="1"/>
    <xs:element name="Side4" type="xs:integer" minOccurs="1"/>
  </xs:sequence>
</xs:group>

<xs:complexType name="Square">
  <xs:group ref="Sides"/>
  <xs:attribute name="squarename" type="xs:string" use="optional" />
  <xs:attribute name="squarenumber" type="xs:integer" use="optional" />
</xs:complexType>

<xs:complexType name="Rectangle">
  <xs:group ref="Sides"/>
  <xs:attribute name="rectanglecolor" type="xs:string" use="optional" />
  <xs:attribute name="rectanglelabel" type="xs:string" use="optional" />
</xs:complexType>

<xs:complexType name="Rhombus">
  <xs:group ref="Sides"/>
  <xs:attribute name="rhombosdance" type="xs:string" use="optional" />
  <xs:attribute name="rhombusname" type="xs:string" use="optional" />
</xs:complexType>

答案 1 :(得分:0)

想出来。我可以使用扩展程序

<xs:complexType name="QuadSides" abstract="true">
  <xs:element name="Side1" type="xs:integer" minOccurs="1"/>
  <xs:element name="Side2" type="xs:integer" minOccurs="1"/>
  <xs:element name="Side3" type="xs:integer" minOccurs="1"/>
  <xs:element name="Side4" type="xs:integer" minOccurs="1"/>
</xs:complexType>

<xs:complexType name="Square">
  <xs:complexContent>
    <xs:extension base="QuadSides">
      <xs:attribute name="squarename" type="xs:string" use="optional" />
      <xs:attribute name="squarenumber" type="xs:integer" use="optional" />
    </xs:extension>
  </xs:complexContent>
</xs:complexType>