1

外部から提供された2つのXSDに準拠したXMLソリューションを実装しています。まず、ns1.xsdがあります。

<schema xmlns:ns1="http://www.test.com/ns1" 
        xmlns:ns2="http://www.test.com/ns2" 
        xmlns:xsd="http://www.w3.org/2001/XMLSchema.xsd" 
        xmlns="http://www.w3.org/2001/XMLSchema" 
        targetNamespace="http://www.test.com/ns1" 
        elementFormDefault="qualified">
    <import namespace="http://www.test.com/ns2" 
        schemaLocation="http://www.test.com/ns2.xsd"/>
    <element name="Root">
        <complexType>
            <sequence>
                <element name="Child" type="ns2:ChildType" 
                         minOccurs="0"/>
            </sequence>
        </complexType>
        <attribute ref="ns2:field3" use="optional"/>
    </element>
</schema>

およびns2.xsd:

<schema xmlns:ns2="http://www.test.com/ns2" xmlns:xsd="http://www.w3.org/2001/XMLSchema.xsd" xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.test.com/ns2" elementFormDefault="qualified" attributeFormDefault="qualified">
    <complexType name="ChildType">
        <attribute name="field1" type="string" use="optional"/>
        <attribute name="field2" type="string" use="optional"/>
    </complexType>
    <attribute name="field3" type="string"/>
</schema>

liquid-technologies.comには、参照型を使用するXSDを実装する方法を示すチュートリアルがあります。その論理に従って、私は次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<Root xmlns="http://www.test.com/ns1" 
      xmlns:ns2="http://www.test.com/ns2" 
      ns2:field3="test">
    <Child ns2:field1="test" ns2:field2="test"/>
</Root>

Xerces2.11.0を使用して検証します。attributeFormDefault="unqualified"ns2.xsdで変更した場合、検証するために実装で名前空間プレフィックスを削除する必要があります。

<?xml version="1.0" encoding="UTF-8"?>
<Root xmlns="http://www.test.com/ns1" 
      xmlns:ns2="http://www.test.com/ns2" 
      ns2:field3="test">
    <Child field1="test" field2="test"/>
</Root>

しばらく前に聞いたように、field3(正しく)まだ接頭辞が付いています。今私は疑問に思う:

  1. field1との真の違いは何field2ですかfield3?Xceresがfield1とのプレフィックスを省略するように強制するのはなぜfield2ですか?それは、属性への参照でありながら、実際には型の一部であるfield1ためですか?field2field3
  2. 2番目のケースでは、受信者はどの名前空間属性field1field2属しているかをどのように判断しますか?

(そして、これらのルールを説明しているW3C記録のどの部分を誰かが知っているなら、私もそれについて本当に素晴らしいでしょう。)

追加情報

この例の結果を指摘したいという衝動を感じます。ケース1field1の場合、field2接頭辞ns2は-namespaceの属性名として明確に確立されますns2ns1上記の属性名のどちらにも接頭辞が付いていないケース2では、これらの属性がデフォルトの( )名前空間に属していること以外に結論を出すことは困難です。

なぜこれが重要なのですか?まあ、これは事実上attributeFormDefault名前空間修飾子に変わったので重要です。これがW3C委員会の意図であると理解するのに深刻な問題があるので、それはバグだと思います。誰かが私を啓発することができれば、私はわくわくするでしょう!

4

1 に答える 1

1

接頭辞が付いていない属性は、通常、名前空間がないと見なされます。それらはデフォルトの名前空間にはありません。(一般的に言って、名前空間が指定されていないなど、別の解釈を好む人もいますが、そのような区別は私には微妙すぎます。)

attributeFormDefault = "unqualified"と言うと、ns2のスキーマドキュメントでローカルに宣言された属性は名前空間に含まれません。つまり、プレフィックスなしでインスタンスに表示される必要があります。

ns2:field3に関しては、属性の宣言がないように見えるため、これは少し奇妙です。ただし、存在する場合は、グローバル属性宣言である必要があり、グローバル属性は常に、含まれているスキーマドキュメントのターゲット名前空間に配置されます。

于 2013-02-18T12:45:59.697 に答える