我有一些带有某些元素的XML,它们没有严格的顺序,之后我有注释,可以是多个:
<xs:element name="person">
<xs:complexType>
<xs:all>
<xs:element name="name" />
<xs:element name="surname" />
<xs:element name="birthday" />
<xs:element name="placeOfBirth" />
</xs:all>
<xs:sequence>
<xs:element name="note" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
是否有替代上面显示的错误xs:complexType
?
修改:有效我希望name
/ surname
/ birthday
/ placeOfBirth
的任意订单后跟任意数量的{{1元素。
答案 0 :(得分:2)
您无法关注具有此类多个元素的xs:all
。
如果您愿意让多个note
元素出现在排序中的任何位置,并且您愿意将其包装在容器元素中,则可以执行以下操作:
<xs:element name="person">
<xs:complexType>
<xs:all>
<xs:element name="name" />
<xs:element name="surname" />
<xs:element name="birthday" />
<xs:element name="placeOfBirth" />
<xs:element name="notes">
<xs:complexType>
<xs:sequence>
<xs:element name="note" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:all>
</xs:complexType>
</xs:element>
或者,如果您愿意将无序部分包装在一个,例如info
元素中,那么这将有效:
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="info">
<xs:complexType>
<xs:all>
<xs:element name="name" />
<xs:element name="surname" />
<xs:element name="birthday" />
<xs:element name="placeOfBirth" />
</xs:all>
</xs:complexType>
</xs:element>
<xs:element name="note" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
但是,我真的放弃了无序约束:
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="name" />
<xs:element name="surname" />
<xs:element name="birthday" />
<xs:element name="placeOfBirth" />
<xs:element name="note" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
具有不同顺序的元素的灵活性往往在实践中不那么有用,并且可以随着模式的发展而产生诸如此类的限制性问题。
答案 1 :(得分:1)
kjhughes已经对选项进行了很好的调查。另外两个可能值得一提:
在XSD 1.1中,允许note
出现在任何地方,而不仅仅是在最后:
<xsd:all
<xsd:element ref="name"/>
<xsd:element ref="surname"/>
<xsd:element ref="birthday"/>
<xsd:element ref="placeofbirth"/>
<xsd:element ref="note" maxOccurs="unbounded"/>
</xsd:all>
对于不是特别漂亮或干净的设计,不需要漂亮或干净的内容模型。拥抱丑陋。研究名称,姓氏,生日和地方出生的24种排列,并编写内容模型以接受它们。
<xsd:choice><xsd:sequence>
<xsd:element ref="name"/>
<xsd:choice><xsd:sequence>
<xsd:element ref="surname"/>
<xsd:choice><xsd:sequence>
<xsd:element ref="birthday"/>
<xsd:element ref="placeofbirth"/>
</xsd:sequence><xsd:sequence>
<xsd:element ref="placeofbirth"/>
<xsd:element ref="birthday"/>
</xsd:sequence></xsd:choice>
</xsd:sequence><xsd:sequence>
<xsd:element ref="birthday"/>
<xsd:choice><xsd:sequence>
<xsd:element ref="surname"/>
<xsd:element ref="placeofbirth"/>
</xsd:sequence><xsd:sequence>
<xsd:element ref="placeofbirth"/>
<xsd:element ref="surname"/>
</xsd:sequence></xsd:choice>
</xsd:sequence><xsd:sequence>
<xsd:element ref="placeofbirth"/>
<xsd:choice><xsd:sequence>
<xsd:element ref="birthday"/>
<xsd:element ref="surname"/>
</xsd:sequence><xsd:sequence>
<xsd:element ref="surname"/>
<xsd:element ref="birthday"/>
</xsd:sequence></xsd:choice>
</xsd:sequence></xsd:choice>
</xsd:sequence><xsd:sequence>
<xsd:element ref="surname"/>
<xsd:choice> ...</xsd:choice>
</xsd:sequence><xsd:sequence>
<xsd:element ref="birthday"/>
<xsd:choice> ...</xsd:choice>
</xsd:sequence><xsd:sequence>
<xsd:element ref="placeofbirth"/>
<xsd:choice> ...</xsd:choice>
</xsd:sequence></xsd:choice>
通过以下方法验证文档:(a)将其转换为更容易验证的相关表格,以及(b)根据该表格的模式进行验证。 (如果现有格式是由上级机构强制执行的,当然,他们可能会认为这种方式是对格式的批评;您需要确定这是否存在危险风险。)