如何在XSD中重用simpleType重新定义

如何在XSD中重用simpleType重新定义,xsd,enumeration,reusability,simpletype,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> <?xml version="1.0

假设在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>
<?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>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:include schemaLocation="use1.xsd"/>
</xs:schema> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:include schemaLocation="use2.xsd"/>
</xs:schema>
<?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>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:include schemaLocation="reused.xsd"/>
    <xs:include schemaLocation="use2.xsd"/>
</xs:schema>

然后在两个不同的xsd中使用该类型:use1.xsduse2.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>
<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>
<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>
<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>
    <xs:simpleType name="myType">
        <xs:restriction base = "myType">
            <xs:enumeration value = "value1"/>
            <xs:enumeration value = "value2"/>
        </xs:restriction>
    </xs:simpleType>
使用1.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>
<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>
<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>
<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>
    <xs:simpleType name="myType">
        <xs:restriction base = "myType">
            <xs:enumeration value = "value1"/>
            <xs:enumeration value = "value2"/>
        </xs:restriction>
    </xs:simpleType>

使用2.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>
<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>
<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>
<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>
    <xs:simpleType name="myType">
        <xs:restriction base = "myType">
            <xs:enumeration value = "value1"/>
            <xs:enumeration value = "value2"/>
        </xs:restriction>
    </xs:simpleType>

然后有两个文件specialruse1.xsdspecialruse2.xsd,它们重新定义了前面的两个xsd:

特殊RUSE1.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>
<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>
<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>
<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>
    <xs:simpleType name="myType">
        <xs:restriction base = "myType">
            <xs:enumeration value = "value1"/>
            <xs:enumeration value = "value2"/>
        </xs:restriction>
    </xs:simpleType>

specularuse2.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>
<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>
<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>
<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>
    <xs:simpleType name="myType">
        <xs:restriction base = "myType">
            <xs:enumeration value = "value1"/>
            <xs:enumeration value = "value2"/>
        </xs:restriction>
    </xs:simpleType>

现在的问题是:如何在Specificularuse1.xsd和Specificularuse2.xsd中重用myType的重新定义,使它们不重复

理想情况下,它将是另一个重复使用的文件.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>
<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>
<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>
<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>
    <xs:simpleType name="myType">
        <xs:restriction base = "myType">
            <xs:enumeration value = "value1"/>
            <xs:enumeration value = "value2"/>
        </xs:restriction>
    </xs:simpleType>


文件reused.xsd中的引用用于SpecialRuse1.xsdSpecialRuse2.xsd

答案实际上取决于您对xsd文件施加了什么约束、对它们的使用以及使用XML模式文件时使用的工具。 此图显示了问题所述的文件布局

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

选项1

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

重用的.xsd

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:simpleType name="myType">
        <xs:restriction base="xs:string" />
    </xs:simpleType>
</xs:schema>
<?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>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:include schemaLocation="use1.xsd"/>
</xs:schema> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:include schemaLocation="use2.xsd"/>
</xs:schema>
<?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>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:include schemaLocation="reused.xsd"/>
    <xs:include schemaLocation="use2.xsd"/>
</xs:schema>

specularuse1.xsd

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:simpleType name="myType">
        <xs:restriction base="xs:string" />
    </xs:simpleType>
</xs:schema>
<?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>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:include schemaLocation="use1.xsd"/>
</xs:schema> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:include schemaLocation="use2.xsd"/>
</xs:schema>
<?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>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:include schemaLocation="reused.xsd"/>
    <xs:include schemaLocation="use2.xsd"/>
</xs:schema>

specularuse2.xsd

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:simpleType name="myType">
        <xs:restriction base="xs:string" />
    </xs:simpleType>
</xs:schema>
<?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>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:include schemaLocation="use1.xsd"/>
</xs:schema> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:include schemaLocation="use2.xsd"/>
</xs:schema>
<?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>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:include schemaLocation="reused.xsd"/>
    <xs:include schemaLocation="use2.xsd"/>
</xs:schema>

选项2

另一个选项应该适用于大多数主流的XML模式编辑器,当只打开一个特定的ruse#.xsd文件时,它将为您提供重新定义的myType;如果您不介意将use1.xsd中的内容(基于图示)拉入Specificularuse2.xsd的范围,则可以这样做

重用的.xsd

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:simpleType name="myType">
        <xs:restriction base="xs:string" />
    </xs:simpleType>
</xs:schema>
<?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>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:include schemaLocation="use1.xsd"/>
</xs:schema> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:include schemaLocation="use2.xsd"/>
</xs:schema>
<?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>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:include schemaLocation="reused.xsd"/>
    <xs:include schemaLocation="use2.xsd"/>
</xs:schema>

specularuse2.xsd

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:simpleType name="myType">
        <xs:restriction base="xs:string" />
    </xs:simpleType>
</xs:schema>
<?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>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:include schemaLocation="use1.xsd"/>
</xs:schema> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:include schemaLocation="use2.xsd"/>
</xs:schema>
<?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>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:include schemaLocation="reused.xsd"/>
    <xs:include schemaLocation="use2.xsd"/>
</xs:schema>

不管选项是什么,PSVI都会精确显示您想要的内容