XSD 不擅长它,如“优雅”。唯一可能有帮助的是使用工会;它可以根据您的特定模式工作,但它可能无法根据您未描述的其他内容工作。
这个想法是重用枚举。为此,您创建简单的类型来封装您希望重用的枚举。只是一个观察,具有多个枚举值在技术上等同于其值的析取(就模式而言)。
<?xml version="1.0" encoding="utf-8" ?>
<xsd:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/XMLSchema.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:simpleType name="myEnumStrings-1">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="first"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="myEnumStrings-2">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="second"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="myEnumStrings-n">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="last"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="myEnumStrings">
<xsd:union memberTypes="myEnumStrings-1 myEnumStrings-2 myEnumStrings-n"/>
</xsd:simpleType>
<xsd:simpleType name="patternRestrictedType">
<xsd:union memberTypes="myEnumStrings-1 myEnumStrings-2"/>
</xsd:simpleType>
<xsd:element name="root-a" type="myEnumStrings"/>
<xsd:element name="root-b" type="patternRestrictedType"/>
</xsd:schema>
以上实现了枚举的重用,或者您定义为联合成员约束的任何其他内容。
root-a 的有效 XML:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<root-a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/XMLSchema.xsd">last</root-a>
root-b 的有效 XML:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<root-b xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/XMLSchema.xsd">second</root-b>
虽然 root-b 的内容适用于 root-a,但反之则不然。
正如我所说,当您想到大系列时,可能并不那么优雅;但是,它应该严格回答我认为您提出的问题,并可能为您提供其他方法的指示。