XSD中的Ref属性或Type属性



我见过这样一个例子:

<xsd:element name="Product">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element name="ProductName" type="xsd:string" />
            <xsd:element name="Customer" type="xsd:CustomerType" />
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>
<xsd:element name="CustomerType">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element name="FullName" type="xsd:string" />
            <xsd:element name="Age" type="xsd:string" />
            <xsd:element name="Age" type="xsd:occupation" />
       </xsd:sequence>
    </xsd:complexType>
</xsd:element>

我想知道在这种情况下,为什么有人会选择type而不是ref

<xsd:element name="Product">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element name="ProductName" type="xsd:string" />
            <xsd:element ref="Customer" />
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>
<xsd:element name="Customer">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element name="FullName" type="xsd:string" />
            <xsd:element name="Age" type="xsd:string" />
            <xsd:element name="Age" type="xsd:occupation" />
       </xsd:sequence>
    </xsd:complexType>
</xsd:element>

有人能解释一下用Type代替ref有什么积极的一面吗?我所知道的是,ref也可以有minOccursmaxOccurs选项,因此您可以在反序列化代码中将ref定义为数组。

有很多方法可以解决这个问题。我想这一切都始于一些基本原则,比如创作风格的一致性。从那时起,人们开始分析以一种方式与另一种方式进行比较的含义;名字被命名为:俄罗斯娃娃,萨拉米切片,神圣的眼睛,伊甸园。如果您想了解更多信息,搜索XSD创作风格(也称为XSD设计模式)将产生大量涉及此主题的网站。这个链接和这个链接都是很好的"快餐"式的参考资料,我会从。。。虽然我不同意其中的一些说法,例如contains only one global element(因此,如果我为Web服务定义一个rq/rs模式,我就不符合要求了?)总体上是一个很好的开端。

在您的案例中,基于引用的元素一致地定义内容模型表明了"Salami Slice"模式:所有元素都是全局的,类型是本地的(匿名的)。第一个含义是不能去掉与标记相关联的命名空间。

不使用引用的元素,而是依赖于局部定义,并且类型是全局的,这表明存在"Venetian Blind"模式。根据上面的名称空间注释,使用这种方法,现在可以通过在schema元素上设置elementFormDefault属性来控制名称空间。

与粒子关联的minOccurs/maxOccurs在此处不相关。对于全局元素,这些属性不适用。对于内容模型粒子,元素是一种,无论元素是refed还是局部的,都没有区别。

相关内容