XSD を変更して、XML の 2 つの場所で異なるデータ型の列挙を利用する方法を決定しようとしています。XML エディターとして Visual Studio 2010 を使用しています。
車両のタイプとその車両の注文の両方を含む XML ドキュメントを想像してみてください。ルールは次のとおりです。
- 各車両には一意の属性 (モデル) が必要なので、属性のタイプは xs:ID にする必要があります。
- 各注文には複数の車両を含めることができるため、モデル属性は xs:string などのタイプにする必要があります。
ここに私の XML ファイルがあります -- Test.xml
<?xml version="1.0" encoding="utf-8" ?>
<sample xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="Test.xsd">
<vehicles>
<vehicle model="Equinox" />
<vehicle model="Impala"/>
<!-- This should not be allowed because it's not unique -->
<vehicle model="Impala" />
<!-- This should not be allowed because it is not a valid model -->
<vehicle model="Apple" />
</vehicles>
<orders>
<order orderid="123">
<item quantity="3" model="Equinox" />
<item quantity="2" model="Impala" />
<item quantity="3" model="Impala" />
</order>
</orders>
</sample>
これが私のXSDファイルです-Test.xsd(XMLと同じ場所にあります)
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
attributeFormDefault="unqualified"
elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="sample">
<xs:complexType>
<xs:sequence>
<xs:element name="vehicles">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="vehicle">
<xs:complexType>
<!-- this instance of model should be unique -->
<xs:attribute name="model" type="UniqueModel" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="orders">
<xs:complexType>
<xs:sequence>
<xs:element name="order">
<xs:complexType>
<xs:sequence>
<xs:element name="item" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="quantity" type="xs:unsignedByte" use="required" />
<!-- this instance of model can be repeated -->
<xs:attribute name="model" type="ModelList" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="orderid" type="xs:unsignedByte" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:simpleType name="UniqueModel">
<xs:restriction base="xs:ID">
<!-- I want to import ModelList here-->
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="ModelList">
<xs:union memberTypes="ChevyModelList DodgeModelList" />
</xs:simpleType>
<xs:simpleType name="ChevyModelList">
<xs:restriction base="xs:normalizedString">
<xs:enumeration value="Equinox" />
<xs:enumeration value="Impala" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="DodgeModelList">
<xs:restriction base="xs:normalizedString">
<xs:enumeration value="Charger" />
<xs:enumeration value="Ram" />
</xs:restriction>
</xs:simpleType>
</xs:schema>
これが可能かどうかを判断するために、Google と Stack Overflow で多くの検索を行いましたが、関連するものは見つかりませんでした。
おそらく、xs:unique を使用してデータを制限するという最初の考えに戻る必要があります。私もこれを機能させることができません:
<xs:element name="vehicles">
<!-- vehicle complexType here -->
<xs:unique name="uniqueModel">
<xs:selector xpath="vechicle" />
<xs:field xpath="@model" />
</xs:unique>
</xs:element>
いずれかのソリューションを機能させるためのヘルプは素晴らしいでしょう!
ありがとう!サッド