外部から提供された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
(正しく)まだ接頭辞が付いています。今私は疑問に思う:
field1
との真の違いは何field2
ですかfield3
?Xceresがfield1
とのプレフィックスを省略するように強制するのはなぜfield2
ですか?それは、属性への参照でありながら、実際には型の一部であるfield1
ためですか?field2
field3
- 2番目のケースでは、受信者はどの名前空間属性
field1
にfield2
属しているかをどのように判断しますか?
(そして、これらのルールを説明しているW3C記録のどの部分を誰かが知っているなら、私もそれについて本当に素晴らしいでしょう。)
追加情報
この例の結果を指摘したいという衝動を感じます。ケース1field1
の場合、field2
接頭辞ns2
は-namespaceの属性名として明確に確立されますns2
。ns1
上記の属性名のどちらにも接頭辞が付いていないケース2では、これらの属性がデフォルトの( )名前空間に属していること以外に結論を出すことは困難です。
なぜこれが重要なのですか?まあ、これは事実上attributeFormDefault
名前空間修飾子に変わったので重要です。これがW3C委員会の意図であると理解するのに深刻な問題があるので、それはバグだと思います。誰かが私を啓発することができれば、私はわくわくするでしょう!