8

属性/要素のペアに共起制約を課すXMLスキーマを作成することは可能ですか?

<primitive-list>
    <primitive name="P1">
        <definition><!-- primitive specification --></definition>
    </primitive>
    <primitive name="P2">
        <definition><!-- primitive specification --></definition>
    </primitive>

    <!-- other common primitives are specified here-->

<primitive-list>

<composite-list>
    <composite name="C1">
        <primitive ref="P1" />
        <primitive ref="P2" />
        <primitive>
            <definition><!-- inline primitive specification --></definition>
        </primitive>        
    </composite>

    <!-- Other compisites are specified here-->

</composite-list>

スキーマは次のことを意味する必要があります。

  • プリミティブ要素がprimitive-list要素内で指定されている場合、 name属性と埋め込まれた定義要素が含まれている必要がありますが、 ref属性は含まれていません。
  • 複合要素でプリミティブ要素が指定されている場合は、 ref属性または定義要素のいずれかが含まれている必要があります。どちらの場合も名前は許可されません。

XMLスキーマ自体の要素要素はそのように動作するので、それは可能だと確信しています。ですから、その神聖な知識を持っている人は誰でも共有してください:-)

前もって感謝します。

4

3 に答える 3

10

インターネットで検索し、いくつかの本を掘り下げた後、それを実装する方法を見つけました。

まず、両方の種類のプリミティブ要素のすべての属性と要素に対応するジェネリック型を定義する必要があります。定義要素が別の場所で定義されていると想定されます。

<xs:complexType name="primitive" abstract="true">
    <xs:sequence>
        <xs:element ref="definition" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>
    <xs:attribute name="name" type="xs:Name" />
    <xs:attribute name="ref" type="xs:Name" />
</xs:complexType>

次に、プリミティブ リストコンポジットでそれぞれ使用する 2 つのプリミティブサブタイプを定義します。

<xs:complexType name="public-primitive">
    <xs:complexContent>
        <xs:restriction base="primitive">
            <xs:sequence>
                <xs:element ref="definition" minOccurs="1" maxOccurs="unbounded" />
            </xs:sequence>
            <xs:attribute name="name" type="xs:Name" use="required" />
            <xs:attribute name="ref" use="prohibited" />
        </xs:restriction>
    </xs:complexContent>
</xs:complexType>

<xs:complexType name="private-primitive">
    <xs:complexContent>
        <xs:restriction base="primitive">
            <xs:sequence>
                <xs:element ref="definition" minOccurs="0" maxOccurs="unbounded" />
            </xs:sequence>
            <xs:attribute name="name" use="prohibited" />
        </xs:restriction>
    </xs:complexContent>
</xs:complexType>

次のように、これらの複合型に関してプリミティブリスト複合要素を定義できます。

<xs:element name="primitive-list">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="primitive" type="public-primitive" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>
</xs:element>

<xs:element name="composite">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="primitive" type="private-primitive" maxOccurs="unbounded">
                <xs:key name="definition-ref--co-occurrence--constraint">
                    <xs:selector xpath="." />
                    <xs:field xpath="definition|@ref" />
                </xs:key>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>

元のスキーマ要件を見て、それらがどのように適用されるかを見てみましょう。

  • プリミティブ要素がプリミティブ リスト要素内で指定されている場合、名前属性と埋め込み定義要素を含める必要がありますが、 ref属性は含めないでください。

この要件は、パブリック プリミティブ型の定義のみによって強制されます。

  • プリミティブ要素が複合要素で指定されている場合、 ref属性または定義要素のいずれかが含まれている必要があります。どちらの場合も名前は許可されません。

この要件は、プライベート プリミティブ型の定義と、複合要素内で定義されたプリミティブ要素で指定されたxs:key要素によって強制されます。xs:keyは、 refまたはdefinitionのいずれかが存在することを保証しますが、両方は存在しません。

于 2008-12-03T08:22:32.207 に答える
0

はい、可能です。XML スキーマを作成するときは、XML ツリー内の要素が定義されている場所に基づいて、シナリオごとに複合型を作成します。

少し時間が経てば、実際にここに例を出してみることができますが、ここに投稿するためにすべてを完全にフォーマットする時間がありません.

個人的には、必要なものが得られるはずなので、このw3schools チュートリアルを見ることを強くお勧めします。

于 2008-11-26T13:47:21.083 に答える
0

わかりました、ここにサンプルがあります。これで終わりです。処理されないのは、コンポジットのプリミティブと ref 属性だけです。私が見つけたものを見ると、スキーマを介してこれを行うことはほとんど不可能のようです。100% 確実ではありませんが、私がこれを確認したすべてのケースで、このようなスキーマが高レベルの検証に使用され、プロセス コードが個々のアイテムの検証に使用されます。

<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://www.iowacomputergurus.com/stackoverflow/samples/xsdexample"
    elementFormDefault="qualified"
    xmlns="http://www.iowacomputergurus.com/stackoverflow/samples/xsdexample"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>

  <xs:complexType name="PrimitiveType">
    <xs:sequence>
      <xs:element name="definition" type="xs:string" minOccurs="1" maxOccurs="1" />
    </xs:sequence>
    <xs:attribute name ="name" use="required" type="xs:string" />
  </xs:complexType>

  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
          <xs:element name="primitive-list" minOccurs="1" maxOccurs="1">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="primitive" type="PrimitiveType" minOccurs="1" maxOccurs="unbounded" />
              </xs:sequence>
            </xs:complexType>
          </xs:element>
          <xs:element name="composite-list" minOccurs="1" maxOccurs="1">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="composite">
                  <xs:complexType>
                    <xs:sequence>
                      <xs:element name="primitive" minOccurs="1" maxOccurs="unbounded">
                        <xs:complexType>
                          <xs:sequence>
                            <xs:element name="definition" minOccurs="0" maxOccurs="1" />
                          </xs:sequence>
                          <xs:attribute name="ref" use="optional" type="xs:string" />
                        </xs:complexType>
                      </xs:element>
                    </xs:sequence>
                    <xs:attribute name="name" type="xs:string" use="required" />
                  </xs:complexType>
                </xs:element>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>  
</xs:schema>
于 2008-11-27T07:54:49.190 に答える