想象一下, 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.xsd 和 use2.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个文件 specificUse1.xsd 和 specificUse2.xsd ,重新定义了两个以前的xsds:
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和specialUse2.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 中的引用用于 specificUse1.xsd 和 specificUse2.xsd 。
答案 0 :(得分:7)
答案实际上取决于您对XSD文件的约束,使用它们以及您将使用的工具来使用XML Schema文件。 此图显示了问题所描述的文件布局。
由于您正在重新定义use1.xsd和use2.xsd,我认为这两个不可编辑(通常由其他人发布/维护)。
选项1
一种方法是从specialUse#.xsd中删除重新定义,将重新定义放在reused.xsd中,并确保所有文件一起使用(例如,在.NET中你有XmlSchemaSet对象,你需要reused.xsd和一个或两个特定的使用#.xsd添加到集合中)。通过将文件放在范围内,PSVI模型实际上将使用重新定义的myType,即使reused.xsd没有被任何特定的使用#.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编辑器,它只会在打开一个特定的使用#.xsd文件时为你提供重新定义的myType;如果您不介意将useUse2.xsd的内容从use1.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都能准确显示您想要的内容。