微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

xml – 如何在XSD中对类型和子类型进行分组

我有这样的 XML

<type>
    <mainType>...</mainType>
    <subtype>...<subtype>
</type>

mainTypes是受限制的xs:strings(它们的列表).每个mainType都有一个可能的子类型列表. IE:
mainTypeA具有可能的子类型:subtype1,subtype2,subtype3
mainTypeB有可能的子类:subtype4,subtype5

如何在XSD中表示这一点,以便每个子类型枚举专门与其主要类型链接
有没有更好的方法来表示这两个字段,使XSD更简单?我并不反对更改XML文档结构.

解决方法

(这可能是@hughadick的答案中的另一个评论,但对于这样的话太长了.)

初始设计中存在两个问题,这会使结构复杂化:

>你有一些可以被视为共现约束的东西因为< subType>只有在< mainType>时才会出现存在
>元素声明是不一致的,因为你有

> …在相同的上下文中(< type>的子项)
> …具有相同名称的元素(< mainType>)
> …但具有不同的类型(不同的值和相关的< subType>元素).

在XML Schema 1.0中,没有一般方法可以使这些功能成为可能,尽管在某些情况下和/或某些方法可以实现这些功能.模糊类型问题的一种可能的解决方法是在实例文档中使用xsi:type属性来确定使用的模式类型(示例1).

我建议您不要使用一些可能的解决方法解决这些问题,而是要关注@hughadick的answer并为所有主要类型创建不同名称的元素,这些元素将再次针对不同的子类型具有不同的元素.如果您不希望将类型名称作为元素名称(或者它不是对XML元素名称有效),则可以将其放在属性中,可能使用认值或固定值(< myType1 typeName =“Type 1名称“>”(示例2).如果子类型是互斥的,您可以将它们放在属性中(< myType1 subType =“subType2”>).如果你真的想在元素内容中使用类型名称(< mainType1> Type 1 name< / mainType1>),那么最好使用< subType>元素作为以下兄弟而不是< mainType1>的子元素因为这会导致混合内容容易导致空白和文本节点位置相关的问题(例3).

是的,替换组也可以与@hughadick的答案一起使用.你会有一个抽象的< mainType> element和所有主要类型元素定义都具有substitutionGroup =“mainType”属性.您仍然需要为不同的主要类型元素使用不同的名称,因为它们允许不同的允许元素/值集合.这些元素的类型必须从抽象类型< mainType>中派生出来.他们替代的元素(例4).

代码示例

例1

<xs:element name="type">
    <xs:complexType>
        <xs:choice>
            <xs:element name="mainType" type="mainType1"/>
            <xs:element name="mainType" type="mainType2"/>
            <xs:element name="mainType" type="mainType3"/>
        </xs:choice>
    </xs:complexType>
</xs:element>

<type>
    <mainType xsi:type="mainType1"/>
</type>

例2

<xs:element name="mainType1">
    <xs:complexType>
        <xs:choice>
            <xs:element ref="subType1"/>
            <xs:element ref="subType2"/>
            <xs:element ref="subType3"/>
        </xs:choice>
        <xs:attribute name="typeName" type="xs:string"/>
    </xs:complexType>
</xs:element>

例3

<xs:element name="type">
    <xs:complexType>
        <xs:choice>
            <xs:sequence>
                <xs:element name="mainType" type="mainType1"/>
                <xs:choice>
                    <xs:element ref="subType1"/>
                    <xs:element ref="subType2"/>
                    <xs:element ref="subType3"/>
                </xs:choice>
            </xs:sequence>
            <!-- repeat similarily for other main types -->
            <xs:sequence>
                <!-- ... -->
            </xs:sequence>
        </xs:choice>
    </xs:complexType>
</xs:element>

例4

<xs:element name="type">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="mainType"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

<xs:element name="mainType" type="mainType" abstract="true"/>
<xs:element name="mainType1" type="typeForMainType1" substitutionGroup="mainType"/>
<xs:element name="mainType2" type="typeForMainType2" substitutionGroup="mainType"/>

<xs:complexType name="mainType">
<!-- deFinition for mainType -->
</xs:complexType>

<xs:complexType name="typeForMainType1">
    <xs:complexContent>
        <xs:restriction base="mainType">
            <!-- deFinition for mainType1 -->
        </xs:restriction>
    </xs:complexContent>
</xs:complexType>

<xs:complexType name="typeForMainType2">
    <xs:complexContent>
        <xs:restriction base="mainType">
            <!-- deFinition for mainType1 -->
        </xs:restriction>
    </xs:complexContent>
</xs:complexType>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。