4

次のようなドキュメント タイプがあります。

<foo>
  <settings>
    <!-- Must be present; in any order -->
    <time>abc</time>
    <validRun>true</validRun>
    <!-- Tool may add whatever ones it wants -->
    <somethingNotCheckedFor>abc</somethingNotCheckedFor>
  </settings>
</foo>

次のドキュメントは、前のドキュメントと意味的に同じです。

<foo>
  <settings>
    <validRun>true</validRun>
    <somethingNotCheckedFor>abc</somethingNotCheckedFor>
    <time>abc</time>
  </settings>
</foo>

ただし、次は無効です。

<foo>
  <settings>
    <validRun>true</validRun>
    <somethingNotCheckedFor>abc</somethingNotCheckedFor>
    <!-- Error: Required element "time" not present -->
  </settings>
</foo>

次のようなことを試しましたが、<xs:all>を含めることが許可されていないため、これは機能しません<xs:any>:

<xs:all>
  <xs:element name="time" />
  <xs:element name="validRun" />
  <xs:any />
</xs:all>

W3Cスキーマでこれを行う手段はありますか?

4

2 に答える 2

3
  1. XSD 1.1 を使用すると、すべてのグループ内でワイルドカードを使用できます。

  2. 必要な要素が名前空間にあり、ジェネレーターによって追加された要素がその名前空間にないことを要求できる場合、必要な言語を認識する選択肢とシーケンスを使用してコンテンツ モデルを作成できます (実際に必要な要素が 2 つしかない場合)。 、それほど難しくありません; 3 つまたは 4 つある場合は面倒になり、5 つ以上ある場合は、コンパイラなしでこの方法を実行したくありません)。必要なのは、次のようなコンテンツ モデルです。

    <xs:sequence>
      <xs:any namespace="##other" 
              minOccurs="0" 
              maxOccurs="unbounded"/>
      <xs:choice>
        <xs:sequence>
          <xs:element ref="time"/>
          <xs:any namespace="##other" 
                  minOccurs="0" 
                  maxOccurs="unbounded"/>
          <xs:element ref="validRun"/>
        </xs:sequence>
        <xs:sequence>
          <xs:element ref="validRun"/>
          <xs:any namespace="##other" 
                  minOccurs="0" 
                  maxOccurs="unbounded"/>
          <xs:element ref="time"/>
        </xs:sequence>
      </xs:choice>
      <xs:any namespace="##other" 
              minOccurs="0" 
              maxOccurs="unbounded"/>
    </xs:sequence>
    
  3. settings緩い繰り返しワイルドカードのみを含むコンテンツ モデルを使用して宣言し、アプリケーション レベルで (1) 両方が含まれていることtimevalidRunおよび (2) これら 2 つの子が有効であることを確認できます。

これらのうち、XSD 1.1 バリデーターを使用できる場合、XSD 1.1 が最も満足のいく結果を生成する可能性が高いと思います。現時点では、Xerces J と Saxon-EE の両方が XSD 1.1 をサポートしています。他のほとんどの XSD ツールにはありません。

于 2012-12-08T01:04:58.357 に答える
2

要素の使い方を知っていると思います<any/>!! つまり、要素を文字通りの意味で受け取ることはできませんが、<any/>可能な要素のリストを宣言する必要があります..

<any/>これは、問題の使用法と解決策を説明すると思います!! :))

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="foo" type="foo"/>
  <xs:complexType name="foo">
    <xs:sequence>
      <xs:element name="settings" type="settings"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="settings">
      <xs:sequence>
        <xs:any minOccurs="1" maxOccurs="1"/>
        <xs:any minOccurs="1" maxOccurs="1"/>
        <xs:any minOccurs="1" maxOccurs="1"/>
      </xs:sequence>
  </xs:complexType>
  <xs:element name="somethingNotCheckedFor" type="xs:string"/>
  <xs:element name="time" type="xs:string" />
  <xs:element name="validRun" type="xs:boolean" />
  <xs:element name="somethingNotCheckedForTWO" type="xs:string"/>
</xs:schema>

上記のスキーマは、宣言されたもの以外の要素を許可しません..そして、それらを繰り返すことも、順序の制限も許可しません!!

<somethingNotCheckedFor/>!!の代わりにすべての可能な要素を宣言できます。私も宣言<somethingNotCheckedForTWO/>したように。

以下にリストされている XML サンプルは検証に成功しています。:
1.

<?xml version="1.0" encoding="utf-8"?>
<foo>
  <settings>
    <time>abc</time>
    <somethingNotCheckedForTWO>abc</somethingNotCheckedForTWO>
    <validRun>true</validRun>
  </settings>
</foo>

2.

<?xml version="1.0" encoding="utf-8"?>
<foo>
  <settings>
    <time>abc</time>
    <validRun>true</validRun>
    <somethingNotCheckedForTWO>abc</somethingNotCheckedForTWO>
  </settings>
</foo>

3.

<?xml version="1.0" encoding="utf-8"?>
<foo>
  <settings>
    <somethingNotCheckedFor>abc</somethingNotCheckedFor>
    <time>abc</time>
    <validRun>true</validRun>
  </settings>
</foo>
于 2012-12-04T07:13:09.283 に答える