如何使用xsd类型的元素“inline”

时间:2014-08-16 14:54:18

标签: xml xsd

我有一个类型代表一些代币,这些代币对应于可以根据需要重复多次的颜色,或者根本不重复(colorType),以及一个交错任意数量的元素(main)出现的颜色和任意文字:

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

  <xs:complexType name="colorType">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="red" type="xs:string"/>
      <xs:element name="blue" type="xs:string"/>
    </xs:choice>
  </xs:complexType>

  <xs:element name="main">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="color" type="colorType"/>
        <xs:element name="text" type="xs:string" minOccurs="0"/>
      </xs:choice>
    </xs:complexType>
  </xs:element>

</xs:schema>

所以我可以这样做:

<main>
  <text>Beginning</text>
  <color><red/><blue/></color>
  <text>Middle</text>
  <color><red/></color>
  <text>End</text>
</main>

我想做的是:

<main>
  <text>Beginning</text>
  <red/><blue/>
  <text>Middle</text>
  <red/>
  <text>End</text>
</main>

换句话说,将colorType保留为类型定义,以便可以在架构中的其他位置重复使用,但将该类型的元素“内联”作为main定义的一部分元素的内容(即,不需要“color”容器)。最终,颜色类型将成为具有各自属性的复杂元素(例如,“<red bright="true"/>”)。

我还在学习XSD,所以任何指向正确方向的指针都会非常有用。

1 个答案:

答案 0 :(得分:1)

我能够通过使用元素组代替colorType的complexType来获得我想要的效果:

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

  <xs:group name="colorType">
    <xs:choice>
      <xs:element name="red" type="xs:string"/>
      <xs:element name="blue" type="xs:string"/>
    </xs:choice>
  </xs:group>

  <xs:element name="main">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:group ref="colorType"/>
        <xs:element name="text" type="xs:string" minOccurs="0"/>
      </xs:choice>
    </xs:complexType>
  </xs:element>

</xs:schema>

<xs:group>插入“内联”,引用它。