0

次の xml ドキュメントがあるとします。

<root xmlns:p="uri:myNamespace">
  <p:tagA>
    <p:tagB />
  </p:tagA>
</root>

tagB は、tagA 内にのみ存在する必要があります。それを検証する xsd を書くことができます:

<xsd:schema ... targetNamespace="uri:myNamespace" elementFormDefault="qualified">
  <xsd:element name="tagA">
    <xsd:complexType>
      <xsd:element name="tagB" type="..." />
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

ここで問題が発生します。外部の名前空間の間のタグを無視したい:

<root xmlns:p="uri:myNamespace">
  <p:tagA>
    <whatever />
    <foo>
      <bar>
        <p:tagB />
      </bar>
    </foo>
  </p:tagA>
</root>

ご覧のとおり、tagB は名前空間なしで他のタグ内にネストされています。

tagA自分の名前空間からの唯一のタグが であることを引き続き強制する XSD を作成することは可能ですか (どのように?) tagB

4

1 に答える 1

0

要素のコンテンツを制約するために XSD (および DTD、Relax NG) で使用されるコンテンツ モデルは、子の正当なシーケンスを定義します。それらは、文脈自由文法における単一の生成規則のように機能します。より深いレベルで子孫を制約することは可能ですが、宣言の途切れのないチェーンが必要です。あなたの例では、宣言が要素内に表示されたときに、fooそれらの間に正確に1つの要素が含まれるようにする必要があります。しかし、あなたの出発点は、それらの要素を制約したくないということです。barp:tagAp:tagB

したがって、コンテンツ モデルを使用して、念頭に置いている制約を表現することはできません。

XSD 1.1 では、要素に関連付けられたアサーションを使用して、その子孫 ( ) の中p:tagAに正確に要素が含まれていることを要求できます。ただし、 にアサーションをアタッチして、それが要素内にのみ出現することを要求することはできません。アサーションは、ツリー内で下方向を見ることはできますが、上方向を見ることはできません。(存在することが保証されているコンテナーの名前がわかっている場合は、そのコンテナーで、すべての p:tagB 要素が ap:tagA 要素に含まれていることをアサートするアサーションを使用できます。 のようなアサーションを使用します。)p:tagBcount(.//p:tagB) eq 1p:tagBp:tagAcount(.//p:tagA//p:tagB) eq count(.//p:tagB)

XSD 1.1 は現在、一部の XSD バリデーターでサポートされていますが、すべての XSD バリデーターではサポートされていません。

于 2013-08-15T15:35:46.633 に答える