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でも機能しますが、その逆は当てはまりません。
私が言ったように、あなたが大きなセットを考えるとき、多分それほどエレガントではないでしょう。しかし、それはあなたが尋ねたと私が思うことに厳密に答えるべきであり、他のアプローチへの指針をあなたに与えるかもしれません。