2

最上位の祖先タイプを条件とする子孫要素が必要です。その関係をxmlスキーマ1.0でモデル化することは可能ですか?もしそうなら、どのように?

以下は、私の望ましい構造/検証動作です。

<a1>
  <b>
    <c>
      <d/> -- allowed if ancestor is a1
    </c>
  </b>
</a1>

<a2>
  <b>
    <c>
      <d/> -- validation error - not allowed if ancestor is not a1
    </c>
  </b>
</a2>

XSD 1.1アサーションを使用すると、まさにそれが可能になるようですが、XMLスキーマ1.0に固執しています。

私は明らかに並列階層を作成し、d要素を1つだけに許可することができましたが、それは冗長で、スキーマのユーザーにとって混乱を招きます。

並列階層は次のようになります。

<a1>
  <b1>
    <c1>
      <d/> -- allowed in c1 element
    </c1>
  </b1>
</a1>

<a2>
  <b2>
    <c2>
      <d/> -- not allowed in c2
    </c2>
  </b2>
</a2>

編集:CMのヒントを使用して上記の質問に対するソリューションスキーマ

<xs:element name="a1">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="b" type="b1"></xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>
<xs:element name="a2">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="b" type="b2"></xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>
<xs:complexType name="b1">
    <xs:sequence>
        <xs:element name="c" type="c1"></xs:element>
    </xs:sequence>
</xs:complexType>
<xs:complexType name="b2">
    <xs:sequence>
        <xs:element name="c" type="c2"></xs:element>
    </xs:sequence>
</xs:complexType>
<xs:complexType name="c1">
    <xs:sequence>
        <xs:element name="d"></xs:element>
    </xs:sequence>
</xs:complexType>
<xs:complexType name="c2">
    <xs:sequence>
    </xs:sequence>
</xs:complexType>
4

1 に答える 1

1

はい、可能です。並列要素階層(a1内にいる場合はb1とc1、a2内にいる場合はb2とc2)のフォールバック提案は、すでに途中にあります。必要なのは、基本的に同じ並列階層ですが、b1とb2と呼ばれる要素が両方ともbと呼ばれるというさらにひねりを加えたものです(c1、c2、cについても同様です)。

重要なのは、名前'b'をa1のコンテキストで1つのタイプの要素(B1と呼びます)にバインドし、a2のコンテキストで別のタイプ(B2)にバインドすることです。次に、名前'c'は、タイプB1のコンテキストでは1つのタイプ(C1)にバインドされ、タイプB2のコンテキストでは別のタイプ(C2)にバインドされます。タイプC1では、d個の要素が許可され、タイプC2では許可されません。

この手法の詳細については、XSD1.0の開発中に書いた論文を参照してください。名前/タイプのバインディングが特定のコンテキストに対してローカルである可能性がある任意のスキーマ言語に同じ手法を適用できることが観察される場合があります。たとえば、RelaxNGは同じようなことをすることができます。

于 2013-01-15T21:30:28.777 に答える