0

親ノードの名前に基づいていない属性が存在するかどうかを確認できる XSD ファイルを作成したいと思います。どうすればそれができるのでしょうか?以下は、私がやろうとしていることの例です。

Xml - 親ノードが「A」であるため、AttrA と AttrB が必要です。

<A>
 <B AttrA="1" AttrB="2" />
</A>

Xml - 親ノードが「C」であるため、AttrB と AttrC が必要です。

<C>
 <B AttrB="2" AttrC="3" />
</C>
4

1 に答える 1

1

これを行う最も簡単な方法は、 B の一方または両方の形式をその親の複合型に対してローカルにすることです。たとえば、A と C が両方とも最上位要素であり、B の両方の形式をローカルにすると、次のように記述できます。

<xs:element name="A">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="B" type="B-in-A"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:element name="C">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="C" type="B-in-C"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

B-in-A と B-in-C の 2 つの型は、好きなように宣言できます。

<xs:complexType name="B-in-A">
  <xs:sequence/>
  <xs:attribute name="AttrA" type="xs:integer"/>
  <xs:attribute name="AttrB" type="xs:integer"/>
</xs:complexType>

<xs:complexType name="B-in-C">
  <xs:sequence/>
  <xs:attribute name="AttrB" type="xs:integer"/>
  <xs:attribute name="AttrC" type="xs:integer"/>
</xs:complexType>

コンテキストによっては、B のジェネリック型を宣言し、そこから B-in-A と B-in-C の 2 つの型を派生させて、相互にある種の遺伝的関係を持たせたい場合があります。そのような派生関係を利用する方法があるかどうかによって異なります。

XSD 1.1 では、必要な AttrB とオプションの AttrA および AttrC を使用して B を宣言し、A と C の型にアサーションを配置して、A 内の B が AttrA を保持し、AttrC を保持していないことを確認するオプションも用意されています。 C の中の B の場合。

これらのどちらがより明確で単純に感じるかは、B の属性の違いを (a) そのコンテキストに基づく B の動作の違いと考えるか、(b) A および/または C に対する制約と考えるかによって異なる場合があります。その子に特定のフォームを要求するという形を取ります。

于 2013-02-16T01:13:46.357 に答える