2013-10-08 1 views
5

次のXML文書とスキーマは、問題が最初に発生しているはるかに大きなスキーマから煮詰めた:スキーマの名前空間を '持っている'と定義されたxml要素に 'null-namespace'が必要なのはなぜですか?

XMLドキュメント:

<f2b:Foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:f2b="http://www.outerfoospace.com/schemas/foo2bar" xsi:schemaLocation="http://www.outerfoospace.com/schemas/foo2bar f2b-0-0-0.xsd"> 
    <f2b:Bar>text</f2b:Bar> 
</f2b:Foo> 

スキーマ:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:f2b="http://www.outerfoospace.com/schemas/foo2bar" targetNamespace="http://www.outerfoospace.com/schemas/foo2bar"> 
    <xs:complexType name="T_Foo"> 
     <xs:sequence> 
      <xs:element name="Bar" xmlns="f2b"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:element name="Foo" type="f2b:T_Foo"/> 
</xs:schema> 

Iスキーマに対してドキュメントを検証すると、<f2b:Bar> -elementに、<f2b:Bar>が必要ではないというエラーメッセージが表示されます。文書を有効にするためには、要素を明示的に(!)ヌルネームスペース '<Bar xmlns="">に入れなければなりません。 null-namespaced要素が必要な理由はわかりません。スキーマはすべての要素の名前空間を定義します。<Foo>要素の場合、f2b -namespaceは確かにバリデータによって期待されます。しかし、私が上記のように<Bar>要素定義の名前空間を明示的に設定しても、バリデータはBar要素に対してはまだxmlns=""と予想されます。 私は運がない答えを見つけるためにスキーマとドキュメントのいくつかのバリエーションを試しました - そして、なぜこの特殊なケースでなぜnull-namespaceが期待されるのかわかりません。

どれヒント感謝... ekke

答えて

3

短い答え:あなたのスキーマのルートxs:schemaタグにelementFormDefault="qualified"を追加します。

デフォルトでは、トップレベルの「グローバル」要素宣言だけが、スキーマのターゲット名前空間を使用します。複合型内の "ローカル"要素宣言は名前空間にありません。 xs:elementタグのform属性を使用するか、xs:schemaelementFormDefaultを使用するすべての要素をグローバルに使用して、特定のローカル要素の1つをオーバーライドできます。

+0

きれいな答えをありがとう - あなたは完全に正しいです。エケ – ekke

関連する問題