如何在XSD中重用simpleType重定义

Tim*_*fey 2 xsd enumeration reusability simpletype

想象一下,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>
Run Code Online (Sandbox Code Playgroud)

然后该类型用于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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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

specialUse1.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>
Run Code Online (Sandbox Code Playgroud)

specialUse2.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>
Run Code Online (Sandbox Code Playgroud)

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

理想情况下,它将是另一个文件reused.xsd:

    <xs:simpleType name="myType">
        <xs:restriction base = "myType">
            <xs:enumeration value = "value1"/>
            <xs:enumeration value = "value2"/>
        </xs:restriction>
    </xs:simpleType>
Run Code Online (Sandbox Code Playgroud)

从该文件的参考reused.xsd在使用particularUse1.xsdparticularUse2.xsd.

Pet*_*dea 7

答案实际上取决于您对XSD文件的约束,使用它们以及您将使用的工具来使用XML Schema文件.此图显示了问题所描述的文件布局.

问题所描述的布局.

由于您正在重新定义use1.xsd和use2.xsd,我认为这两个不可编辑(通常由其他人发布/维护).

选项1

一种方法是从specialUse#.xsd中删除重定义,将重新定义放在reused.xsd中,并确保所有文件一起使用(例如,在.NET中你有XmlSchemaSet对象,你需要重用. xsd和一个或两个特定用户#.xsd添加到集合中).通过将文件放在范围内,PSVI模型实际上将使用重新定义的myType,即使reused.xsd未被任何特定的使用#.xsd文件显式引用.

布局选项1

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>
Run Code Online (Sandbox Code Playgroud)

particularUse1.xsd

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:include schemaLocation="use1.xsd"/>
</xs:schema> 
Run Code Online (Sandbox Code Playgroud)

particularUse2.xsd

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:include schemaLocation="use2.xsd"/>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)

选项2

这个其他选项应该适用于大多数主流XML Schema编辑器,它只会在打开一个特定的使用#.xsd文件时为您提供重新定义的myType; 这提供了你不介意从use1.xsd(基于插图)拉入特定的UI2.xsd的内容.

布局选项2

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>
Run Code Online (Sandbox Code Playgroud)

particularUse2.xsd

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:include schemaLocation="reused.xsd"/>
    <xs:include schemaLocation="use2.xsd"/>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)

无论选项如何,PSVI都能准确显示您的需求.

PSVI显示重新定义的类型