1

基本型から要素を派生させたい。この基本型 (Entity と呼びましょう) には id 属性があります。派生要素の場合、この属性に制限を追加したいと思います (派生エンティティ要素ごとに異なる制限):

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:complexType name="Entity">
        <xs:attribute name="id">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:pattern value="[A-Z]+[0-9]+"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
    <xs:element name="someEntity">
        <xs:complexType>
            <xs:complexContent>
                <xs:extension base="Entity">
                    <xs:sequence>
                        <xs:element name="someAdditionalElement"/>
                    </xs:sequence>
                    <!-- I would like to restrict the attribute "id" for this entity to e.g. the pattern "SOME[0-9]+" -->
                </xs:extension>
            </xs:complexContent>
        </xs:complexType>
    </xs:element>
    <xs:element name="otherEntity">
        <xs:complexType>
            <xs:complexContent>
                <xs:extension base="Entity">
                    <xs:sequence>
                        <xs:element name="otherAdditionalElement"/>
                    </xs:sequence>
                    <!-- I would like to restrict the attribute "id" for this entity to a differtnt pattern like e.g. "OTHER[0-9]+" -->
                </xs:extension>
            </xs:complexContent>
        </xs:complexType>
    </xs:element>
</xs:schema>

これは可能ですか?

4

1 に答える 1

4

型を拡張するときに、型 Entity に要素を確実に追加できます。タイプを制限するときに id 属性を確実に制限できます。あなたが説明したことのうち、あなたができない唯一のことは、(1)型を同時に拡張および制限すること、および(2)10進数を含む文字列を受け入れることを許可することにより、大文字のアルファベット文字列のみを受け入れる id 属性を「制限」することです。数字も。(それは、やりたいことができないと言ったときに、MiMo が念頭に置いていたことかもしれません。)

したがって、あなたが望むことを行う方法は次のとおりです。

  1. 派生型で許可するすべての形式の id を許可する id 属性を使用して、複合型エンティティを定義します。
  2. 派生型 (あなたの例では someEntity と otherEntity) ごとに、最初に Entity の制限を派生させ、次にその制限の拡張を派生させます。これらの中間型を他の要素に使用したくない場合は、それらを抽象化します。

属性 (ここでは id 属性) のタイプを制限する場合、XSD バリデーターは、新しいタイプが古いタイプの制限であることを簡単に確認できる必要があります。したがって、エンティティの id 属性にローカルで定義された型を使用したくありません。定義されたタイプが必要です。したがって、Entity の宣言を、次のような 2 つの宣言に置き換える必要があります。

<xs:simpleType name="uppercase-alphanumeric-string">
  <xs:restriction base="xs:string">
    <xs:pattern value="[A-Z0-9]+"/>
  </xs:restriction>
</xs:simpleType>

<xs:complexType name="Entity">
  <xs:attribute name="id" type="uppercase-alphanumeric-string"/>
</xs:complexType>

次に、要素 someEntity のタイプを 2 つのステップで定義できます。最初に、エンティティ型の適切な制限を使用して複合型を定義します。

<xs:complexType name="Entity-restriction-SOME" abstract="true">
  <xs:complexContent>
    <xs:restriction base="Entity">
      <xs:attribute name="id">
        <xs:simpleType>
          <xs:restriction base="uppercase-alphanumeric-string">
            <xs:pattern value="SOME[0-9]+"></xs:pattern>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
    </xs:restriction>
  </xs:complexContent>
</xs:complexType>

上記のように、制限してから延長するか、延長してから制限するかのいずれかを実行できます。拡張型のコンテンツ モデルを再指定する必要がないように、最初に制限を行っています。

次に、通常の方法で制限の拡張を指定できます。

<xs:element name="someEntity">
  <xs:complexType>
    <xs:complexContent>
      <xs:extension base="Entity-restriction-SOME">
        <xs:sequence>
          <xs:element name="someAdditionalElement"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
</xs:element>

otherElement は、読者の演習として残しておきます。

于 2013-06-21T16:17:31.007 に答える