7

次のような XML の非常に単純な XML スキーマを作成しようとしています。

<messages>
  <item>
    <important_tag></important_tag>
  </item>
  <item>
    <important_tag></important_tag>
    <tag2></tag2>
  </item>
  <item>
    <tag2></tag2>
    <tag3></tag3>
  </item>
</messages>

アイデアは<important_tag>、特定の定義を持ち、下に表示される場合と表示されない場合があるということ<item>です。複数回出現することもあります。また、その前後に他のタグがあるかもしれ<important_tag>ませんが、事前に名前を付けることができません.

について具体的に定義したいと思い<important_tag>ます。たとえば、含まれている必要がある属性を定義します。つまり重要なタグが存在する場合、それは私の定義に準拠している必要があります。その他のタグは、定義に準拠する必要はありません。

次のスキームを使用してみました。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="messages">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="item" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="item">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="important_tag" minOccurs="0"/>
        <xs:any minOccurs="0"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="important_tag">
    <xs:complexType>
      <xs:simpleContent>
        ... specific definitions for important_tag ...
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
</xs:schema>

これにより、スキーマがあいまいであるというエラーが発生します。

正確なエラー メッセージは次のとおりです。

cos-nonambig: '<xs:element ref="important_tag">' makes the content model non-deterministic against '<xs:any>'. Possible causes: name equality, overlapping occurrence or substitution groups.

Altova の XML Spy を使用しています。

これを解決するにはどうすればよいですか?

ありがとう、ダナ

4

3 に答える 3

7

MSDNには、拡張可能なスキーマの設計について説明しているすばらしい記事があります。ここですべてを確認することをお勧めしますが、具体的には、ポイント2でこのエラーが発生する理由を説明しています。バージョン管理可能なXML形式を設計するためのスキーマ」(「非決定論的」を検索して、そこに直接到達できます。

基本的に、xs:any要素を取得すると、バリデーターは他の兄弟要素について何も想定できなくなります。したがって、これらの必須属性を必要としないimportant_tagの定義があり、これらの要素を検証できません。

于 2008-12-22T15:45:01.130 に答える
6

エラーについて: そのエラー メッセージには、含まれている xsd にない行が記載されていますが、その中の次の 2 行はあいまいです:

<xs:element ref="important_tag" minOccurs="0"/>
<xs:any minOccurs="0"/>

あいまいさを示す最も簡単な例は、 が 1 つしかない場合です<important_tag>

  <important_tag></important_tag>

問題は、それが 1 つの「important_tag」と 0 の「any」タグとして解釈される可能性があることです (これはあなたが望んでいたことです)。これは、「any」タグが「important_tag」を含む任意のタグと一致する可能性があるためです。

XML Schema の次のバージョンでは、重要なタグ以外の任意のタグを指定できるようになると読みました。

XML を 2 つの異なる方法で照合することは、正規表現「a*a*」が「a」を 2 つの異なる方法 (最初の「a」または 2 番目の「a」) で照合することに似ています。このあいまいさは、DTD の XML 仕様では「非決定論的」と呼ばれていましたが、XML スキーマ仕様ではそれを Unique Particle Attribution rule (UPA) と呼んでいます。つまり、スキーマのどの部分が各部分を取得するかを判断できるはずです。 XML ドキュメントの。

于 2009-01-02T17:52:45.050 に答える
1

要件(「他のタグはどの定義にも準拠する必要はありません。」など)では、ルール(「これは真でなければならない」、「それは偽でなければならない」)に基づくSchematronの方が適している場合があります。 「すべてがそのようでなければならない」というW3Cスキーマよりもソリューションです。

于 2008-12-22T15:48:58.017 に答える