如何在 XSD 复杂类型定义中混合扩展和限制

Posted

技术标签:

【中文标题】如何在 XSD 复杂类型定义中混合扩展和限制【英文标题】:How to mix extensions and restrictions in XSD complex type definitions 【发布时间】:2016-02-04 18:52:45 【问题描述】:

我在创建复杂类型时遇到问题,该类型需要非(null|blank)并且具有同样非(null|blank)的“限定符”属性。这是我目前所拥有的。

<xsd:complexType name="PRODUCT">
    <xsd:simpleContent>
        <xsd:extension base="xsd:string">
            <xsd:attribute name="Qualifier" type="xsd:string" use="required" />
        </xsd:extension>
        <xsd:restriction base="xsd:string">
            <xsd:minLength value="1"/>
        </xsd:restriction>
    </xsd:simpleContent>        
</xsd:complexType>

【问题讨论】:

【参考方案1】:

不可能在同一个类型定义中同时拥有extensionrestriction。定义一个带限制的简单类型,然后扩展这个自定义类型。您可以将这种简单类型用于元素和属性定义。

请注意,XML(以及,如果您原谅双关,XML Schema)是区分大小写的。 “qualifier”和“Qualifier”不是同一个属性名。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:element name="PRODUCT" type="PRODUCTType"/>

    <xs:complexType name="PRODUCTType">
        <xs:simpleContent>
            <xs:extension base="restrictedType">
                <xs:attribute name="qualifier" type="restrictedType" use="required" />
            </xs:extension>
        </xs:simpleContent>        
    </xs:complexType>

    <xs:simpleType name="restrictedType">
            <xs:restriction base="xs:string">
                <xs:minLength value="1"/>
            </xs:restriction>
    </xs:simpleType>

</xs:schema>

以下 XML 文档将针对上述架构有效:

<?xml version="1.0" encoding="UTF-8"?>
<PRODUCT qualifier="value">text</PRODUCT>

而文件喜欢

<?xml version="1.0" encoding="UTF-8"?>
<PRODUCT qualifier="">text</PRODUCT>

<?xml version="1.0" encoding="UTF-8"?>
<PRODUCT qualifier="value"></PRODUCT>

将无效。

【讨论】:

以上是关于如何在 XSD 复杂类型定义中混合扩展和限制的主要内容,如果未能解决你的问题,请参考以下文章

xsd 具有混合内容的复杂类型

如何使用混合值(整数和字符串)限制更改XML / XSD中的complexType?

RAML:如何仅导出特定类型的 XSD

JAXB:如何在XSD中指定attr类型时更改XJC生成的类名?

F#如何在递归可区分联合中指定类型限制

将具有混合复杂类型元素的 XML 转换为 DataSet,以及其他 DataSet 限制