Xsd 任何订单+;每个元素的约束
我试图创建一个XSD,它允许子元素以任何顺序排列。但是每个子元素都有自己的minOccurs和maxOccurs 我的XSD:Xsd 任何订单+;每个元素的约束,xsd,xsd-validation,Xsd,Xsd Validation,我试图创建一个XSD,它允许子元素以任何顺序排列。但是每个子元素都有自己的minOccurs和maxOccurs 我的XSD: <xsd:complexType name="Samples"> <xsd:sequence > <xsd:element name="Sample1" minOccurs="1" maxOccurs="1"> <xsd:complexType> <xsd:simpleContent>
<xsd:complexType name="Samples">
<xsd:sequence >
<xsd:element name="Sample1" minOccurs="1" maxOccurs="1">
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base="xsd:boolean" />
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
<xsd:element name="Sample2" minOccurs="0" maxOccurs="unbounded">
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base="xsd:string" />
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
例如,有效的XML:
<Samples>
<Sample2></Sample2>
<Sample1></Sample1>
<Sample2></Sample2>
</Samples>
例如,无效的XML(Sample1只能选择一次):
但我不知道,当所有元素都有自己的约束条件时,如何混合顺序
感谢您的帮助如果您尝试以下方法,会怎么样:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="Samples">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Sample2" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="Sample1" minOccurs="1" maxOccurs="1"/>
<xsd:element name="Sample2" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
当然,您应该为每个元素添加限制:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:complexType name="Sample1Type">
<xsd:simpleContent>
<xsd:extension base="xsd:boolean" />
</xsd:simpleContent>
</xsd:complexType>
<xsd:complexType name="Sample2Type">
<xsd:simpleContent>
<xsd:extension base="xsd:string" />
</xsd:simpleContent>
</xsd:complexType>
<xsd:element name="Samples">
<xsd:complexType>
<xsd:sequence>
<xsd:element type="Sample2Type" name="Sample2" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element type="Sample1Type" name="Sample1" minOccurs="1" maxOccurs="1"/>
<xsd:element type="Sample2Type" name="Sample2" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
对于简单类型,甚至更短:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="Samples">
<xsd:complexType>
<xsd:sequence>
<xsd:element type="xsd:string" name="Sample2" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element type="xsd:boolean" name="Sample1" minOccurs="1" maxOccurs="1"/>
<xsd:element type="xsd:string" name="Sample2" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
附言::
不幸的是,没有像
XSD:sequence
这样的XSD元素,它将允许您请求的内容。您想要的内容看起来像XSD:all;但是,由于xsd:all仅适用于maxOccurs为1的元素,因此它在这里不起作用。如果您可以组合选择和序列来约束内容,一种避免重复定义(避免定义两次)的方法是将Sample1和sample2定义为全局元素,然后在合成器下引用它们。如果除了根元素之外,定义全局元素不是一个选项,那么您至少可以全局定义类型-这样您可以最大限度地重用,并且在某种程度上更接近您的需求“无需定义两次” 是的,这就是我的意思。但是,如果不两次定义元素“Sample2”,我如何解决这个问题呢?我已经用一个例子更新了我的答案,说明了如何使用相同的方法,但是指定了您的类型。谢谢您的帮助。也许我必须考虑其他的方法来解决这个问题。你有没有一个例子来说明你的建议?
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="Samples">
<xsd:complexType>
<xsd:sequence>
<xsd:element type="xsd:string" name="Sample2" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element type="xsd:boolean" name="Sample1" minOccurs="1" maxOccurs="1"/>
<xsd:element type="xsd:string" name="Sample2" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>