具有混合内容的XSD节点,以任何顺序出现任意次数

时间:2011-08-09 19:56:49

标签: xml xsd

我坚持如何创建和XSD,允许'对象'节点的孩子是“文本”或“图像”节点,任何次数和任何顺序显示。它们在“对象”节点中出现的顺序决定了它们的呈现方式,但不需要验证顺序。

示例1

<objects>
    <textobject x="30" y="100" value="blah1" />
    <imageobject x="0" y="0" src="/path/to/some/image1.png"/> 
    <imageobject x="0" y="0" src="/path/to/some/image2.png"/>
    <textobject x="60" y="250" value="blah2" />
    <textobject x="60" y="250" value="blah3" />
</objects>

示例2

<objects> 
    <imageobject x="0" y="0" src="/path/to/some/image1.png"/>
    <textobject x="30" y="100" value="blah1" />
    <textobject x="60" y="250" value="blah2" />
    <imageobject x="0" y="0" src="/path/to/some/image2.png"/>
    <textobject x="60" y="250" value="blah3" />
</objects>

谢谢!

3 个答案:

答案 0 :(得分:3)

在这种情况下,使用替代组可能是合适的。将“mediaObject”定义为抽象元素,将“textObject”和“imageObject”作为其替换组的成员,然后将内容模型定义为<xs:element ref="mediaObject" minOccurs="0" maxOccurs="unbounded"/>。这种设计的优点是它更具可扩展性,它实现了关注点的分离,语义的更好表达以及定义的更高可重用性。当有15种媒体对象而不是两种媒体对象时,真正开始显示的好处。

答案 1 :(得分:1)

使用<xs:choice maxOccurs="unbounded">

答案 2 :(得分:1)

您可以将xs:choiceminOccurs="0"maxOccurs="unbounded"

一起使用
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xs:element name="objects">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="imageobject"/>
        <xs:element ref="textobject"/>
      </xs:choice>
    </xs:complexType>
  </xs:element>
  <xs:element name="imageobject">
    <xs:complexType>
      <xs:attribute name="src" use="required"/>
      <xs:attribute name="x" use="required" type="xs:integer"/>
      <xs:attribute name="y" use="required" type="xs:integer"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="textobject">
    <xs:complexType>
      <xs:attribute name="value" use="required"/>
      <xs:attribute name="x" use="required" type="xs:integer"/>
      <xs:attribute name="y" use="required" type="xs:integer"/>
    </xs:complexType>
  </xs:element>
</xs:schema>