2

次の XML 名前空間仕様はどのように解釈されるべきですか?

デフォルトの名前空間宣言は、そのスコープ内の接頭辞のないすべての要素名に適用されます。デフォルトの名前空間宣言は属性名に直接適用されません。接頭辞のない属性の解釈は、それらが現れる要素によって決定されます。

私の直感的な理解は、接頭辞のない属性は、それらが属する要素の名前空間に属するものとして解釈されるべきだということです。ただし、次の例は、これが間違っていることを証明しているようです。

スキーマ:

<xs:schema xmlns:myns="http://test.com/xsd/foo" elementFormDefault="qualified" 
           targetNamespace="http://test.com/xsd/foo" version="1.0" 
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:attribute name="Id" type="xs:string" />
    <xs:element name="Foo">
        <xs:complexType>
            <xs:attribute ref="myns:Id" />
    </xs:complexType>
    </xs:element>
</xs:schema>

検証に合格する例:

<a:Foo xmlns:a="http://test.com/xsd/foo" a:Id="123" />

検証に失敗する例:

<Foo xmlns="http://test.com/xsd/foo" Id="123" />

何を与える?

4

3 に答える 3

2

ここでは、2つの別々の質問があります。1つ目はXMLに関するもので、2つ目はXMLスキーマ(XSD)に関するものです。

XMLでは(具体的には、XML名前空間の推奨事項で定義されているように)、接頭辞のない属性は名前空間にありません。一部のコメンテーターは、これを名前空間が未定義(つまりアプリケーション定義)であることを意味すると解釈しますが、通常のより簡単な解釈は、それがnullであるということです。つまり、名前空間はありません。この状況で名前空間URIを要求すると、ほとんどのAPI仕様はnullを返しますが、長さがゼロの文字列を返すものもあります。

XSDでは、グローバル属性宣言は、それが宣言されているXMLスキーマドキュメントのターゲット名前空間で、または含まれているスキーマドキュメントでターゲット名前空間が指定されていない場合は名前空間なしで属性を定義します。このため、グローバル属性宣言を使用することは珍しいことです。一般的な手法は、属性グループ(場合によっては、単一の属性を含む属性グループ)を宣言することです。このような属性グループで宣言された属性は、グローバル宣言ではなくローカル宣言であるため、attributeFormDefault = "qualified"と言わない限り、含まれているスキーマドキュメントのターゲット名前空間を継承しません。これはかなり奇妙なことです。

于 2012-06-18T17:29:03.263 に答える
0

スキーマ内の属性には名前空間があるため、属性 Id は名前空間の外で解釈され、スキーマと一致しないようです。ただし、次のように、スキーマが異なる方法で宣言されている場合:

<xs:schema xmlns:myns="http://test.com/xsd/foo" elementFormDefault="qualified" targetNamespace="http://test.com/xsd/foo" version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="Foo">
        <xs:complexType>
          <xs:attribute name="Id" type="xs:string" />
        </xs:complexType>
    </xs:element>
</xs:schema>

以前は無効だったドキュメントが検証され、その逆も同様です。targetNamespace原因は、属性の名前空間がその親<schema>要素の属性によって定義されているか、存在しない場合は対象の名前空間が存在しないことを XML スキーマが定義しているためと思われます。後者の場合、親は<complexType>ではなく で<schema>あるため、属性は名前空間を取得しません。

ただし、元の質問の接頭辞のない属性の解釈に関するメモは、まだ不可解です。

于 2012-06-18T16:17:14.827 に答える
0

以前に同様の質問に投稿した詳細な回答を見てください。

getAttributeNS の動作は何ですか?

明示的に接頭辞を付けない限り、属性には名前空間がありません。他のドキュメントに混在する可能性のある要素とは異なり、属性は、それを保持する要素の範囲内でのみ意味をなすという考えです。のような例外はほとんどありませんxml:langが、大部分は、所有する要素で論理的に「スコープ」されています (したがって、バインドされています)。したがって、本当に必要になるまで名前空間はありません。

于 2012-06-18T16:47:32.983 に答える