1

私が使用しているXSDの場合、検証されたマークアップは有効なHTMLです。私が適用しようとしているルールは、どのHTML要素にも適用できるはずです。言い換えれば、私のルールは要素に依存しません。私は主に属性の制約に関心があります。

<xs:element name="div">
    <xs:complexType>
        <xs:sequence>
            <xs:any>
                    <xs:attribute name="containerColor">
                        <xs:simpleType>
                            <xs:restriction base="xs:string">
                                <xs:enumeration value="green"/>
                                <xs:enumeration value="red"/>
                                <xs:enumeration value="blue"/>
                                <xs:enumeration value="yellow"/>
                                <xs:enumeration value="grey"/>
                                <xs:enumeration value="black"/>
                            </xs:restriction>
                        </xs:simpleType>
                    </xs:attribute>
                    <xs:unique name="id" >
                        <xs:selector xpath="*"></xs:selector>
                        <xs:field xpath="*"></xs:field>
                    </xs:unique>
                </xs:any>
            </xs:sequence>
    </xs:complexType>
</xs:element>

XSDは初めてです。私にはいくつかの根本的な誤解があると確信しています。

  • 上記の例では、「containerColor」属性を持つことができる(ただし、持つ必要はありません)と言いたいです。この属性を使用する場合は、列挙された色の1つである必要があります。

  • さらに、どの要素にもIDを付けることができ、一意である必要があります。

上記の試みで、any要素が属性/一意の有効なコンテキストではないという苦情があります。

セレクターの観点から、私は構築しているルールを特定の要素ではなくすべての要素のセットに適用することに関心があります。XSDでこれを達成する方法はありますか?

4

2 に答える 2

1

いいえ、XSDワイルドカードを使用して必要なものを定式化することはできません。このリンクは、XSD 1.0のxsd:anyパーティクル、およびXSD1.1のこのパーティクルで何ができるかについてのビューを提供します。基本的に、ネストできるのは注釈だけです。

本当に必要な場合は、他のスキーマ言語を使用する必要があります。Relax NGは、<element>に汎用名クラス<anyName>を使用することで、必要なことを非常に簡単に実行できる唯一のスキーマ言語(私が知っている)です。ただし、一意性は処理されません(私は信じています)。xsd:IDデータ型に依存する必要があります。

独自性とSchematronについては、これもSOでご覧ください。XSD 1.1がオプションの場合、少なくともSchematronパーツを置き換えることができます。

于 2013-03-06T23:05:06.993 に答える
1

XSDスキーマを記述して必要な処理を実行できるかどうかは、制約するドキュメントの量と、関連する要素に自由に名前を付けることができるかどうかによって異なります。

通常の場合、属性がすべての要素に適用されることはめったにないため、属性は特定の複合型に関連付けて(したがって、特定の要素に間接的に)宣言されます。(例:containerColorという名前の属性は、HTMLのヘッド要素とメタ要素に表示されるときに意味がありますか?それではどういう意味ですか?)

ただし、XSDはトップレベル属性の宣言をサポートしています。次のXSDスキーマは、名前空間にない名前付きの属性を宣言しidますcontainerColor

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

  <xs:attribute name="containerColor">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:enumeration value="green"/>
        <xs:enumeration value="red"/>
        <xs:enumeration value="blue"/>
        <xs:enumeration value="yellow"/>
        <xs:enumeration value="grey"/>
        <xs:enumeration value="black"/>
      </xs:restriction>
    </xs:simpleType>
  </xs:attribute>

  <xs:attribute name="id" type="xs:ID"/>

</xs:schema>

これらはトップレベルの属性であり、特定の要素にバインドされていません。したがって、原則として、このスキーマをXSDバリデーターに渡して、ドキュメントをスキャンし、XSD宣言がないものすべてを受け入れ、宣言があるものすべてを検証するように要求できます。(XSD仕様では、これを「緩い検証」と呼んでいます。)2つの属性に対する宣言のみが含まれるため、それらを検証し、他のすべてを渡します。その結果、宣言する属性はすべての要素で許可され、それらが発生する場所で検証されます。

ここでの主な問題は、XSDがバリデーターと外界との間のインターフェースを規制または定義しようとしないことであり、仕様への準拠を主張する特定のバリデーターがそのような要求でそれを呼び出すことができるという保証はありません。(利点は、多くのXSDバリデーターでは、ドキュメント要素から開始する緩い検証がデフォルトの操作モードであり、場合によっては唯一のモードであるため、使用しているバリデーターでうまく機能する可能性があります。)

別の方法は、XHTML用のXSDスキーマドキュメントのローカルコピーを作成し、それらを運ぶことができるはずのすべての要素に属性を追加することです。XSD 1.1には、そのタスクを簡単にするいくつかの構造があります。

于 2013-03-06T23:18:44.513 に答える