【问题标题】:How to reuse simpleType redefinition in XSD如何在 XSD 中重用 simpleType 重定义
【发布时间】:2011-12-04 15:26:06
【问题描述】:

想象在 definition.xsd

中有一个已定义的简单类型
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:simpleType name="myType">
        <xs:restriction base="xs:string" />
    </xs:simpleType>
</xs:schema>

那么该类型在2个不同的xsds中使用:use1.xsduse2.xsd

use1.xsd

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">    
    <xs:include schemaLocation="definition.xsd"></xs:include>    
    <xs:complexType name="ComplexType1">
        <xs:attribute name="typeInstance1" type="myType" use="required" />
    </xs:complexType>
</xs:schema>

use2.xsd

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">    
    <xs:include schemaLocation="definition.xsd"></xs:include>    
    <xs:complexType name="ComplexType2">
        <xs:attribute name="typeInstance2" type="myType" use="required" />
    </xs:complexType>
</xs:schema>

然后有2个文件particularUse1.xsdparticularUse2.xsd,重新定义了之前的两个xsd:

particularUse1.xsd

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:redefine schemaLocation="use1.xsd">
        <xs:simpleType name="myType">
            <xs:restriction base = "myType">
                <xs:enumeration value = "value1"/>
                <xs:enumeration value = "value2"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:redefine>
</xs:schema>

particularUse2.xsd

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:redefine schemaLocation="use2.xsd">
    <xs:simpleType name="myType">
        <xs:restriction base = "myType">
            <xs:enumeration value = "value1"/>
            <xs:enumeration value = "value2"/>
        </xs:restriction>
    </xs:simpleType>
</xs:redefine>
</xs:schema>

现在的问题:我如何才能重用 myType 的重新定义,特别是 Use1.xsd 和 specificUse2.xsd,它们不会重复。

最好是另一个文件reused.xsd

    <xs:simpleType name="myType">
        <xs:restriction base = "myType">
            <xs:enumeration value = "value1"/>
            <xs:enumeration value = "value2"/>
        </xs:restriction>
    </xs:simpleType>

reused.xsd 文件中的引用用于 particularUse1.xsdparticularUse2.xsd

【问题讨论】:

    标签: xsd enumeration reusability simpletype


    【解决方案1】:

    答案实际上取决于您对 XSD 文件施加的限制、它们的使用以及您将用于使用 XML Schema 文件的工具。 此图显示了问题所述的文件布局。

    由于您要重新定义 use1.xsd 和 use2.xsd,我会假设这两个是不可编辑的(通常由其他人发布/维护)。

    选项 1

    一种方法是从 specificUse#.xsd 中删除重定义,将重定义放在reused.xsd 中,并确保所有文件一起使用(例如,在.NET 中您有XmlSchemaSet 对象,您需要已重用.xsd 和其中一个或两个都添加到集合中)。通过将文件置于范围内,PSVI 模型实际上将使用重新定义的 myType,即使任何特定的 Use#.xsd 文件都没有明确引用 reused.xsd。

    reused.xsd

    <?xml version="1.0" encoding="utf-8"?>
    <!--XML Schema generated by QTAssistant/XSR Module (http://www.paschidev.com)-->
    <xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified"     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <xsd:redefine schemaLocation="definition.xsd">
        <xsd:simpleType name="myType">
          <xsd:restriction base="myType">
            <xsd:enumeration value="value1"/>
            <xsd:enumeration value="value2"/>
        </xsd:restriction>
        </xsd:simpleType>
      </xsd:redefine>
    </xsd:schema>
    

    particularUse1.xsd

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
        <xs:include schemaLocation="use1.xsd"/>
    </xs:schema> 
    

    particularUse2.xsd

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
        <xs:include schemaLocation="use2.xsd"/>
    </xs:schema>
    

    选项 2

    这个其他选项应该适用于大多数主流 XML Schema 编辑器,它会在仅打开一个特定的 Use#.xsd 文件时为您提供重新定义的 myType;前提是您不介意将 use1.xsd 中的内容拉入到 specificUse2.xsd 的范围内(基于插图)。

    reused.xsd

    <?xml version="1.0" encoding="utf-8"?>
    <!--XML Schema generated by QTAssistant/XSR Module (http://www.paschidev.com)-->
    <xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified"     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <xsd:redefine schemaLocation="use1.xsd">
        <xsd:simpleType name="myType">
          <xsd:restriction base="myType">
            <xsd:enumeration value="value1"/>
            <xsd:enumeration value="value2"/>
        </xsd:restriction>
        </xsd:simpleType>
      </xsd:redefine>
    </xsd:schema>
    

    particularUse2.xsd

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
        <xs:include schemaLocation="reused.xsd"/>
        <xs:include schemaLocation="use2.xsd"/>
    </xs:schema>
    

    无论选项如何,PSVI 都能准确显示您想要的内容。

    【讨论】:

      猜你喜欢
      • 2011-01-06
      • 2012-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多