0

スキーマにカスタムデータ型があるとします。

  <xs:element name="Fruit">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="Name"/>
        <xs:element ref="Supplier"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="Name" type="xs:NCName"/>
  <xs:element name="Supplier" type="xs:string"/>

スキーマの他の場所でFruitの特定のインスタンスを要求したいので、次のXMLファイルのようなものがあります。

<fruits>
  <common>
    <!-- the common section should always include Fruits with these Names -->
    <Fruit>
      <Name>apple</Name>
      <Supplier>Shady Orchard</Supplier>
    </Fruit>
    <Fruit>
      <Name>orange</Name>
      <Supplier>Florida Orange Co.</Supplier>
    </Fruit>
    <Fruit>
      <Name>banana</Name>
      <Supplier>Bananaland</Supplier>
    </Fruit>
  </common>
  <exotic>
    <Fruit>
      <Name>kiwano</Name>
      <Supplier>Fancy Fruits</Supplier>
    </Fruit>
    <Fruit>
      <Name>rambutan</Name>
      <Supplier>Indonesia Fruit Co.</Supplier>
    </Fruit>
    <!-- the list goes on... -->
  </exotic>
</fruits>

私は自分のファイルで次のようにエキゾチックなセクションを定義できることを知っています:

  <xs:element name="exotic">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" ref="Fruit"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

しかし、リンゴオレンジバナナという名前のsが常に必要になるように、共通のセクションをどのように定義すればよいでしょうか。Fruit

4

1 に答える 1

1

回避するのはそれほど難しいことではありません。もっとエレガントな解決策があると確信していますが、これはうまくいくでしょう。唯一のことは、特定のインスタンスは実際には必要ありませんが、これらの値にのみ一致する特殊な型を作成することです。値を修正することで型の制限なしでそれを行う方法があったことはかなり確信していますが、属性を思い出せず、3つの値の代替で機能するかどうかわかりません。

これがxsdです

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/FruitSchema"
xmlns:fr="http://www.example.org/FruitSchema" xmlns:tns="http://www.example.org/FruitSchema"
elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="fruits">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="fr:common" minOccurs="1" maxOccurs="1"/>
            <xs:element ref="fr:exotic" minOccurs="1" maxOccurs="1" />
        </xs:sequence>
    </xs:complexType>
</xs:element>

<xs:element name="fruit">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="fr:name" />
            <xs:element ref="fr:supplier" />
        </xs:sequence>
    </xs:complexType>
</xs:element>

<xs:element name="name" type="xs:NCName" />
<xs:element name="supplier" type="xs:string" />

<xs:element name="exotic">
    <xs:complexType>
        <xs:sequence>
            <xs:element maxOccurs="unbounded" ref="fr:fruit" />
        </xs:sequence>
    </xs:complexType>
</xs:element>

<xs:element name="common">
    <xs:complexType>
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fruit">
                <xs:complexType>
                    <xs:sequence minOccurs="1" maxOccurs="1">
                        <xs:element name="name" type="fr:CommonFruitType" />
                        <xs:element ref="fr:supplier" />
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>

<xs:simpleType name="CommonFruitType">
    <xs:restriction base="xs:NCName">
        <xs:enumeration value="apple" />
        <xs:enumeration value="orange" />
        <xs:enumeration value="banana" />
    </xs:restriction>
</xs:simpleType>

検証に失敗した例を次に示します。

<?xml version="1.0" encoding="UTF-8"?>
<fruits xmlns="http://www.example.org/FruitSchema" xmlns:fr="http://www.example.org/FruitSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.example.org/FruitSchema FruitSchema.xsd">
    <common>
        <!-- the common section should always include fruits with these names -->
        <fruit>
            <name>apple</name>
            <supplier>Shady Orchard</supplier>
        </fruit>
        <fruit>
            <name>apple</name>
            <supplier>Shady Orchard</supplier>
        </fruit>
        <fruit>
            <name>orange</name>
            <supplier>Florida Orange Co.</supplier>
        </fruit>
        <fruit>
            <name>banana</name>
            <supplier>Bananaland</supplier>
        </fruit>
        <fruit>
            <name>kiwano</name>
            <supplier>Fancy fruits</supplier>
        </fruit>
    </common>
    <exotic>
        <fruit>
            <name>kiwano</name>
            <supplier>Fancy fruits</supplier>
        </fruit>
        <fruit>
            <name>rambutan</name>
            <supplier>Indonesia fruit Co.</supplier>
        </fruit>
        <!-- the list goes on... -->
    </exotic>
</fruits>

commonサプライヤーが何であれ、リンゴ、オレンジ、バナナなどの果物のみを検証します。

于 2012-05-25T00:24:20.517 に答える