elementFormDefault
は何をし、いつ使用する必要がありますか?
そこで、elementFormDefault
値の定義をいくつか見つけました。
修飾-要素と属性はスキーマのtargetNamespaceにあります
非修飾-要素と属性には名前空間がありません
したがって、その定義から、スキーマが修飾に設定されている場合、タイプに名前空間をプレフィックスする必要があると思いますか?そして、その問題については、1つのセットで資格を持たないシナリオもありますか? Googlingを試しましたが、得られたのは非常に理解しにくいW3Cページのみでした。
これが今作業しているファイルです。targetNamespace
をtarget:TypeAssignments
と同じものとして宣言するときに、なぜ型をxmlns:target
として宣言する必要があるのですか?
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:target="http://www.levijackson.net/web340/ns"
targetNamespace="http://www.levijackson.net/web340/ns"
elementFormDefault="qualified">
<element name="assignments">
<complexType>
<sequence>
<element name="assignments" type="target:TypeAssignments"
minOccurs="1" maxOccurs="unbounded"/>
</sequence>
</complexType>
</element>
<complexType name="TypeAssignments">
<sequence>
<element name="assignment" type="target:assignmentInfo"
minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</complexType>
<complexType name="assignmentInfo">
<sequence>
<element name="name" type="string"/>
<element name="page" type="target:TypePage"/>
<element name="file" type="target:TypeFile"
minOccurs="0" maxOccurs="unbounded"/>
</sequence>
<attribute name="id" type="string" use="required"/>
</complexType>
<simpleType name="TypePage">
<restriction base="integer">
<minInclusive value="50" />
<maxInclusive value="498" />
</restriction>
</simpleType>
<simpleType name="TypeFile">
<restriction base="string">
<enumeration value=".xml" />
<enumeration value=".dtd" />
<enumeration value=".xsd" />
</restriction>
</simpleType>
</schema>
ElementFormDefaultは、スキーマ内の型の名前空間とは関係ありません。スキーマに準拠するXMLドキュメント内の要素の名前空間に関するものです。
仕様の関連セクションは次のとおりです。
Element Declaration Schema Component Property {target namespace} Representation If form is present and its ·actual value· is qualified, or if form is absent and the ·actual value· of elementFormDefault on the <schema> ancestor is qualified, then the ·actual value· of the targetNamespace [attribute] of the parent <schema> element information item, or ·absent· if there is none, otherwise ·absent·.
つまり、スキーマの最上部で宣言したtargetNamespaceは、elementFormDefaultが "qualified"であるか、または要素がform = "qualified"としてスキーマで明示的に宣言されている場合、スキーマ準拠のXMLドキュメントの要素にのみ適用されます。 。
例:elementFormDefaultが非修飾の場合-
<element name="name" type="string" form="qualified"></element>
<element name="page" type="target:TypePage"></element>
「name」要素がtargetNamespaceに、「page」要素がnull名前空間にあることを期待します。
すべての要素宣言にform = "qualified"を配置する手間を省くために、elementFormDefault = "qualified"を指定すると、要素宣言にform = "unqualified"を配置して上書きしない限り、targetNamespaceが各要素に適用されます。
AuthorType
要素で使用される次のComplexType author
を検討してください
<xsd:complexType name="AuthorType">
<!-- compositor goes here -->
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="phone" type="tns:Phone"/>
</xsd:sequence>
<xsd:attribute name="id" type="tns:AuthorId"/>
</xsd:complexType>
<xsd:element name="author" type="tns:AuthorType"/>
elementFormDefault="unqualified"
その後、次のXMLインスタンスが有効です
<x:author xmlns:x="http://example.org/publishing">
<name>Aaron Skonnard</name>
<phone>(801)390-4552</phone>
</x:author>
著者の名前属性は、名前空間(非修飾)を指定せずに許可されます。 <xsd:complexType>
の一部である要素は、complexTypeに対してローカルと見なされます。
if elementFormDefault="qualified"
インスタンスは、修飾されたローカル要素を持つ必要があります
<x:author xmlns:x="http://example.org/publishing">
<x:name>Aaron Skonnard</name>
<x:phone>(801)390-4552</phone>
</x:author>
詳細については this リンクを参照してください
古い、よくある質問に対する新しい詳細な回答と説明...
短い答え:elementFormDefault="qualified"
をxsd:schema
に追加しない場合、デフォルトのunqualified
値は、ローカルに宣言された要素が名前空間なし。
elementFormDefault
が何をするかについて多くの混乱がありますが、これは短い例ですぐに明確になります...
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:target="http://www.levijackson.net/web340/ns"
targetNamespace="http://www.levijackson.net/web340/ns">
<element name="assignments">
<complexType>
<sequence>
<element name="assignment" type="target:assignmentInfo"
minOccurs="1" maxOccurs="unbounded"/>
</sequence>
</complexType>
</element>
<complexType name="assignmentInfo">
<sequence>
<element name="name" type="string"/>
</sequence>
<attribute name="id" type="string" use="required"/>
</complexType>
</schema>
キーポイント:
assignment
要素はローカルに定義されています。elementFormDefault
のデフォルト値がunqualified
であるためです。elementFormDefault="qualified"
を常に使用して、assignment
がターゲット名前空間にあるようにします。このXMLは、上記のXSDに従って有効であるように見えます。
<assignments xmlns="http://www.levijackson.net/web340/ns"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.levijackson.net/web340/ns try.xsd">
<assignment id="a1">
<name>John</name>
</assignment>
</assignments>
注意:
assignments
のデフォルト名前空間は、assignments
とそのすべての子孫をデフォルト名前空間(http://www.levijackson.net/web340/ns
)に配置します。有効なように見えますが、上記のXMLは次の混乱する検証エラーを生成します。
[エラー] try.xml:4:23:cvc-complex-type.2.4.a:要素「assignment」で始まる無効なコンテンツが見つかりました。 「{assignment}」のいずれかが必要です。
注:
assignment
要素を見つけることが期待されていたが、実際にはassignment
を見つけたため、コンテンツが無効であると言うこの診断を呪う最初の開発者ではないでしょう。 element.([〜#〜] wtf [〜#〜])assignment
の周りの{
および}
は、検証がassignment
inを期待していたことを意味しますnamespace ここに。残念ながら、assignment
要素を見つけたと言っても、名前空間がないこととは異なるデフォルトの名前空間で見つかったことは言及していません。elementFormDefault="qualified"
要素にxsd:schema
を追加します。これは、XSDでローカルに宣言されている場合、有効なXMLはターゲット名前空間に要素を配置する必要があることを意味します。それ以外の場合、有効なXMLは、ローカルに宣言された要素を名前空間に配置しないでください。assignment
が名前空間に属さないというXSDの要件に準拠するようにXMLを変更します。これは、たとえば、xmlns=""
をassignment
要素に追加することで実現できます。ElementFormDefaultで重要な点は、locally定義された要素、通常はcomplexTypeブロック内の名前付き要素に適用されることです。スキーマのレベル。 elementFormDefault = "qualified"を使用すると、スキーマのターゲット名前空間をドキュメントのデフォルト名前空間として使用して、xmlドキュメント内からスキーマ内のローカル要素をアドレス指定できます。
実際には、elementFormDefault = "qualified"を使用して、ネストされたブロックで要素を宣言できます。そうでない場合は、最上位ですべての要素を宣言し、ref属性を使用してネストされた要素のスキーマでそれらを参照する必要があります。はるかにコンパクトなスキーマ。
XML Schema Primerのこのビットはそれについて語っています: http://www.w3.org/TR/xmlschema-0/#NS
elementFormDefault = "qualified"は、スキーマドキュメント自体(.xsdファイル)の名前空間ではなく、XMLインスタンスドキュメント(.xmlファイル)の名前空間の使用を制御するために使用されます。
ElementFormDefault = "qualified"を指定することにより、このスキーマで検証されたドキュメントで使用される名前空間宣言を強制します。
一般に、この値を指定して、要素を非修飾ではなく修飾する必要があることを宣言します。ただし、attributeFormDefault = "unqualified"はデフォルト値であるため、名前空間を修飾したくない場合は、スキーマドキュメントで指定する必要はありません。
ElementFormDefault = "qualified"が使用されている場合、XMLSpy(少なくとも2011バージョン)にはtargetNameSpaceが定義されている必要があることに気付きました。そうしないと検証されません。また、名前空間の接頭辞を持つXMLを生成しません