xsd:sequence含xsd:simpleType致XML Schema编译失败问题排查
错误原因与解决方案
错误原因
XSD的<xsd:sequence>节点有明确的内容模型约束,仅允许包含以下节点类型:annotation、element、group、choice、sequence、any。你直接将<xsd:simpleType>作为<xsd:sequence>的子节点,违反了这一语法规则,因此触发编译错误。
解决方案
你需要将自定义的<xsd:simpleType>与对应的<xsd:element>关联,而不是直接放在<xsd:sequence>下,有两种常见实现方式:
方式1:内联定义元素专属约束
将<xsd:simpleType>嵌套在目标<xsd:element>内部,作为该元素的自定义类型,适合仅当前元素使用的约束:
<xsd:complexType name="RegisterEventsSubRequestType"> <xsd:sequence> <xsd:element name="Canal" type="xsd:integer"></xsd:element> <xsd:element name="Ean13"> <xsd:simpleType> <xsd:restriction base="xsd:integer"> <xsd:totalDigits value="13"/> </xsd:restriction> </xsd:simpleType> </xsd:element> <xsd:element name="Center"> <xsd:simpleType> <xsd:restriction base="xsd:integer"> <xsd:totalDigits value="4"/> </xsd:restriction> </xsd:simpleType> </xsd:element> <xsd:element name="Date" type="xsd:dateTime"></xsd:element> <xsd:element name="SubColectives" type="tns:SubColectivesType"/> </xsd:sequence> </xsd:complexType>
方式2:定义全局可复用类型
如果该约束需要被多个元素复用,可以在<xsd:schema>根节点下定义全局<xsd:simpleType>,再通过type属性引用:
<!-- 全局类型定义 --> <xsd:simpleType name="Ean13Type"> <xsd:restriction base="xsd:integer"> <xsd:totalDigits value="13"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name="CenterType"> <xsd:restriction base="xsd:integer"> <xsd:totalDigits value="4"/> </xsd:restriction> </xsd:simpleType> <!-- 引用全局类型 --> <xsd:complexType name="RegisterEventsSubRequestType"> <xsd:sequence> <xsd:element name="Canal" type="xsd:integer"></xsd:element> <xsd:element name="Ean13" type="tns:Ean13Type"></xsd:element> <xsd:element name="Center" type="tns:CenterType"></xsd:element> <xsd:element name="Date" type="xsd:dateTime"></xsd:element> <xsd:element name="SubColectives" type="tns:SubColectivesType"/> </xsd:sequence> </xsd:complexType>
注意:引用全局类型时要确保使用正确的命名空间前缀(示例中为tns:),需与你的XSD命名空间配置一致。
内容的提问来源于stack exchange,提问作者Wail
相关产品推荐
相关产品推荐

