我坚持如何创建和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>
谢谢!
答案 0 :(得分:3)
在这种情况下,使用替代组可能是合适的。将“mediaObject”定义为抽象元素,将“textObject”和“imageObject”作为其替换组的成员,然后将内容模型定义为<xs:element ref="mediaObject" minOccurs="0" maxOccurs="unbounded"/>
。这种设计的优点是它更具可扩展性,它实现了关注点的分离,语义的更好表达以及定义的更高可重用性。当有15种媒体对象而不是两种媒体对象时,真正开始显示的好处。
答案 1 :(得分:1)
使用<xs:choice maxOccurs="unbounded">
。
答案 2 :(得分:1)
您可以将xs:choice
与minOccurs="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>