XSD では elementFormDefault は何をしますか?
-
13-09-2019 - |
質問
どういうことですか elementFormDefault
いつ使用する必要がありますか?
そこで私はいくつかの定義を見つけました elementFormDefault
値:
資格のある - 要素と属性はスキーマのTargetNamesSpaceにあります
無資格 - 要素と属性には名前空間がありません
したがって、その定義から、スキーマが修飾されているように設定されている場合、なぜ型の前に名前空間を付ける必要があるのかと思います。また、そのために不適格に設定されるシナリオは何ですか?グーグルで検索してみましたが、非常にわかりにくい W3C のページがいくつか表示されただけでした。
これは私が現在作業しているファイルです。なぜタイプを次のように宣言する必要があるのですか? target:TypeAssignments
私が宣言するとき targetNamespace
と同じものとして 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·.
これが意味するのは、elementFormDefault が "qualified" であるか、要素がスキーマ内で form="qualified" を持つように明示的に宣言されている場合、スキーマの先頭で宣言した targetNamespace は、スキーマ準拠の 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 が各要素に適用されます。
他のヒント
次の ComplexType について考えてみましょう。 AuthorType
によって使われた 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>
著者の name 属性は、名前空間を指定せずに許可されます (修飾されていません)。の一部である要素 <xsd:complexType>
は、complexType に対してローカルであると見なされます。
もし elementFormDefault="qualified"
その場合、インスタンスには修飾されたローカル要素が必要です
<x:author xmlns:x="http://example.org/publishing">
<x:name>Aaron Skonnard</name>
<x:phone>(801)390-4552</phone>
</x:author>
ご参照ください これ 詳細についてはリンクをご覧ください
よくある古い質問に対する新しい詳細な回答と説明...
短い答え:追加しない場合 elementFormDefault="qualified"
に xsd:schema
, 、その後デフォルト unqualified
値は、ローカルに宣言された要素が 名前空間がありません.
何をするかについては多くの混乱があります elementFormDefault
そうですが、これは短い例ですぐに説明できます...
XSD の合理化されたバージョン:
<?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
要素はローカルに定義されます。 - XSD でローカルに定義された要素は、デフォルトでは名前空間にありません。
- これは、デフォルト値が
elementFormDefault
はunqualified
. - これはおそらく、XSD の作成者による設計ミスです。
- 標準的な方法では、常に使用します。
elementFormDefault="qualified"
となることによってassignment
予想されるように、ターゲットネームスペースにあります。
- これは、デフォルト値が
一見有効な XML
この 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:無効なコンテンツは、要素「割り当て」から始まりました。'{assionment}'の1つが予想されます。
ノート:
- 次のように思われるこの診断を呪った開発者はあなたが初めてではないでしょう。 コンテンツが見つかると予想されていたため、コンテンツは無効です。
assignment
要素ですが、実際にはassignment
要素。 (なんと、) - これが実際に意味すること:の
{
そして}
その周りassignment
検証が期待されていることを意味しますassignment
名前空間がない ここ。残念なことに、それが見つかったと言ったとき、assignment
要素では、名前空間がない場合とは異なるデフォルトの名前空間でそれが見つかったことについては言及されていません。
解決
- ほとんどの場合: 追加
elementFormDefault="qualified"
にxsd:schema
XSD の要素。つまり、有効な XML は、XSD でローカルに宣言されるときに、要素をターゲットの名前空間に配置する必要があります。それ以外の場合、有効な XML はローカルに宣言された要素を名前空間に配置する必要があります。 - 当時のごく少数派: XMLを変更して、XSDの要件に準拠しています
assignment
名前空間に存在しないこと。これは、たとえば、追加することで実現できますxmlns=""
にassignment
要素。
elementFormDefault で注意すべき重要な点は、それが適用されるということです。 ローカルで 定義された要素。スキーマのトップレベルで定義されたグローバル要素とは対照的に、通常は complexType ブロック内の名前付き要素です。elementFormDefault="qualified" を使用すると、スキーマのターゲット名前空間をドキュメントのデフォルトの名前空間として使用して、XML ドキュメント内からスキーマ内のローカル要素をアドレス指定できます。
実際には、ネストされたブロックで要素を宣言できるようにするには、elementFormDefault="qualified" を使用します。それ以外の場合は、最上位ですべての要素を宣言し、ref 属性を使用してネストされた要素内のスキーマ内で要素を参照する必要があります。はるかにコンパクトなスキーマではありません。
XML スキーマ入門のこの部分では、それについて説明しています。 http://www.w3.org/TR/xmlschema-0/#NS
elementFormDefault="qualified" は、スキーマ ドキュメント自体 (.xsd ファイル) 内の名前空間ではなく、XML インスタンス ドキュメント (.xml ファイル) 内の名前空間の使用を制御するために使用されます。
elementFormDefault="qualified" を指定すると、このスキーマで検証されたドキュメントで名前空間宣言が使用されるようになります。
この値を指定して、要素を非修飾ではなく修飾する必要があることを宣言するのが一般的です。ただし、attributeFormDefault="unqualified" がデフォルト値であるため、名前空間を修飾したくない場合は、スキーマ文書で指定する必要はありません。
XMLSpy (少なくとも 2011 バージョン) では、elementFormDefault="qualified" が使用されている場合、targetNameSpace を定義する必要があることに気付きました。それ以外の場合は検証されません。また、名前空間プレフィックスを含む XML も生成されません。