所以我一直试图这样做:
<xs:element name="ROOM"> <xs:complexType> <xs:all> <xs:element ref="NAME"/> <xs:element ref="ADRESS"/> </xs:all> <xs:sequence> <xs:element maxOccurs="unbounded" ref="FILM"/> </xs:sequence> <xs:attribute name="group" type="xs:NCName"/> <xs:attribute name="typ" use="required" type="xs:NCName"/> </xs:complexType> </xs:element>
我知道< xs:all> tag不能是同一子级别的其他元素的元素的一部分…但是找不到出路……
有什么建议 ?提前致谢 !
解决方法
存在用于约束组中元素的第三选项:组中的所有元素可以出现一次或根本不出现,并且它们可以以任何顺序出现. all group(提供SGML& -Connector的简化版本)仅限于任何内容模型的顶级.此外,组的子项必须都是单独的元素(没有组),并且内容模型中的任何元素都不会出现多次,即minOccurs和maxOccurs的允许值为0和1.例如,允许子元素为purchaSEOrder以任何顺序出现,我们可以将PurchaSEOrderType重新定义为:
一个’所有’组
<xsd:complexType name="PurchaSEOrderType"> <xsd:all> <xsd:element name="shipTo" type="USAddress"/> <xsd:element name="billTo" type="USAddress"/> <xsd:element ref="comment" minOccurs="0"/> <xsd:element name="items" type="Items"/> </xsd:all> <xsd:attribute name="orderDate" type="xsd:date"/> </xsd:complexType>
根据这个定义,注释元素可以选择出现在purchaSEOrder中,它可以出现在任何shipTo,billTo和items元素之前或之后,但它只能出现一次.此外,所有小组的规定不允许我们在小组外宣布诸如评论之类的元素作为使其不止一次出现的手段. XML Schema规定,所有组必须作为内容模型顶部的唯一子项出现.换句话说,以下是非法的:
带有“全部”组的非法示例
<xsd:complexType name="PurchaSEOrderType"> <xsd:sequence> <xsd:all> <xsd:element name="shipTo" type="USAddress"/> <xsd:element name="billTo" type="USAddress"/> <xsd:element name="items" type="Items"/> </xsd:all> <xsd:sequence> <xsd:element ref="comment" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:sequence> <xsd:attribute name="orderDate" type="xsd:date"/> </xsd:complexType>
我对当时讨论的回忆是,xsd:如果它的限制比这个要小,那么所有这些都太复杂了.它很快扩展到非确定性解析模型.所以限制是0或1,没有兄弟姐妹.
SGML有一个更强大的模型使用&连接器,但并非所有系统都实现它.
编辑如果您希望在此级别验证XML,可以使用Schematron作为模式之后的第二个验证器.它基于XSLT,这种类型的约束更容易表达.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。