2

私は次の2つのXSDS、test.xsdを持っています

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"    
  xmlns:xsd="http://www.w3.org/2001/XMLSchema.xsd" 
  xmlns:ns1="http://www.test.com/ns1"     
  targetNamespace="http://www.test.com" 
  elementFormDefault="qualified"
  attributeFormDefault="unqualified">
    <import namespace="http://www.test.com/ns1" schemaLocation="test1.xsd"/>
    <element name="Root">
        <complexType>
            <sequence>
                <element name="Child" type="string"/>
            </sequence>
            <attribute ref="ns1:myAttrib1" use="required"/>
            <attribute ref="ns1:myAttrib2" use="required"/>
        </complexType>
    </element>
</schema>

およびtest1.xsd

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
  xmlns:xsd="http://www.w3.org/2001/XMLSchema.xsd" 
  xmlns:ns1="http://www.test.com/ns1" 
  targetNamespace="http://www.test.com/ns1" 
  elementFormDefault="qualified" attributeFormDefault="unqualified">
    <attribute name="myAttrib1" type="string"/>
    <attribute name="myAttrib2" type="string"/>
</schema>

インスタンスドキュメントは次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<Root xmlns="http://www.test.com" xmlns:ns1="http://www.test.com/ns1" 
  ns1:myAttrib1="1" ns1:myAttrib2="2">
    <Child>Child 1</Child>
</Root>

Xerces 2.11.0を使用して、属性にプレフィックスmyAttrib1myAttrib2付け、ns1検証に合格する必要があります。最初は、これはスキーマ定義に準拠していないと感じましたが(attributeFormDefault="unqualified"inのためns1)、もう一度考えてみると、それは理にかなっています。これが私がそれを理解する方法です:属性myAttrib1myAttrib2はで定義されていないのでプレフィックスが必要ですtargetNamespaceそれらが使用されるデフォルトの名前空間。つまり、で定義されていませんxmlns="http://www.test.com"

これが私の質問です:1)上記の属性にプレフィックスを付ける必要性を正しく理解しましたか?2)W3Cレコードのどこにありますか。この振る舞いを説明する一節を見つけてもいいですか?ありがとう。:)

更新:私は次のパッセージに出くわしました

最後の2つの属性(elementFormDefaultとattributeFormDefault)は、W3C XMLスキーマによって提供される機能であり、単一のスキーマ内で、属性と要素がデフォルトで修飾されていると見なされるかどうかを制御します(名前空間内)。修飾と非修飾のこの区別は、上記のようにデフォルト値を指定することによって示すことができますが、要素と属性を定義するときに、修飾または非修飾の値のフォーム属性を追加することによっても示すことができます。

非修飾として指定できるのはローカル要素と属性のみであることに注意することが重要です。グローバルに定義されたすべての要素と属性は、常に修飾する必要があります。

xml.comで見つかりました。もう1つの興味深いソースはzvon.orgです。したがって、これは実際に受け入れられた答えをバックアップします。ただし、(悪名高い謎めいた)W3Cの記録がどこにあるのかはまだ正確にはわかりません。これについて詳しく述べています。結局のところ、彼らはこの質問の統治機関です。

4

2 に答える 2

2

スキーマの最上位の要素と属性の宣言は、常にスキーマのtargetNamespaceにあります。およびはelementFormDefaultattributeFormDefault複合型内にネストされている匿名の要素/属性宣言にのみ適用されます。test.xsdスキーマで指定されていない場合、複合型内elementFormDefault="qualified"の要素は名前空間に含まれず、インスタンスドキュメントは次のようになります。Child

<?xml version="1.0" encoding="UTF-8"?>
<ns:Root xmlns:ns="http://www.test.com" xmlns:ns1="http://www.test.com/ns1" 
  ns1:myAttrib1="1" ns1:myAttrib2="2">
    <Child>Child 1</Child>
</Root>

さらに、名前空間にある属性には接頭辞を付ける必要xmlns="..."があります。デフォルトの名前空間宣言は要素にのみ適用されます。したがって

<?xml version="1.0" encoding="UTF-8"?>
<ns:Root xmlns="http://www.test.com/nl1" xmlns:ns="http://www.test.com" 
  myAttrib1="1" myAttrib2="2">
    <ns:Child>Child 1</ns:Child>
</ns:Root>

無効です-myAttrib1とmyAttrib2は名前空間にありません。

于 2012-11-06T12:27:11.637 に答える
1

1)正解です。ただし、attributeFormDefaultとはローカルで定義された属性と要素elementFormDefaultにのみ適用されます。言い換えると、スキーマの直接の子ではなく他のスキーマコンポーネント内にネストされて再定義されたものです。

2)セクション3.2 .2は、refがQNameでなければならないことを示しています。一般に、XSDのどこにでもref属性が表示され、QNameタイプになります。

于 2012-11-06T12:27:53.093 に答える