2

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>

いずれかのソリューションを機能させるためのヘルプは素晴らしいでしょう!

ありがとう!サッド

4

1 に答える 1

2

このxs:ID型は、一意性だけでなく、値を有効な XML 名に制限します。これは特に、スペースがなく、数字で始まっていないことを意味します (たとえば、「307」という名前のプジョー モデルはあり得ません)。 . おそらくキーを使用して問題にアプローチします

<xs:element name="sample">
  <xs:key name="modelName">
    <xs:selector xpath="vehicles/vehicle" />
    <xs:field xpath="@model" />
  </xs:key>
  <xs:keyRef name="orderModel" refer="modelName">
    <xs:selector xpath="orders/order/item" />
    <xs:field xpath="@model" />
  </xs:keyRef>

vehicle要素のmodel属性を type にしますModelList。内のkeyモデル名vehiclesが一意であることをkeyRef確認し、各注文項目に記載されているモデルが実際に にリストされているモデルの 1 つであるかどうかを確認する必要がありvehiclesます。そうすれば、属性のタイプを実際に制限する必要はまったくありません。 が列挙を強制するitem/@modelので、単純なものにすることができxs:stringます。keyRef

于 2012-10-19T12:41:35.250 に答える