web-dev-qa-db-ja.com

XSDでelementFormDefaultは何をしますか?

elementFormDefaultは何をし、いつ使用する必要がありますか?

そこで、elementFormDefault値の定義をいくつか見つけました。

修飾-要素と属性はスキーマのtargetNamespaceにあります

非修飾-要素と属性には名前空間がありません

したがって、その定義から、スキーマが修飾に設定されている場合、タイプに名前空間をプレフィックスする必要があると思いますか?そして、その問題については、1つのセットで資格を持たないシナリオもありますか? Googlingを試しましたが、得られたのは非常に理解しにくいW3Cページのみでした。

これが今作業しているファイルです。targetNamespacetarget: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>
80
Levi

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が各要素に適用されます。

67
Alohci

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 リンクを参照してください

54
Girish

古い、よくある質問に対する新しい詳細な回答と説明...

短い答え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:要素「assignment」で始まる無効なコンテンツが見つかりました。 「{assignment}」のいずれかが必要です。

注:

  • assignment要素を見つけることが期待されていたが、実際にはassignmentを見つけたため、コンテンツが無効であると言うこの診断を呪う最初の開発者ではないでしょう。 element.[〜#〜] wtf [〜#〜]
  • これが本当に何を意味するか:assignmentの周りの{および}は、検証がassignment inを期待していたことを意味しますnamespace ここに。残念ながら、assignment要素を見つけたと言っても、名前空間がないこととは異なるデフォルトの名前空間で見つかったことは言及していません。

解決

  • ほとんどの場合:XSDのelementFormDefault="qualified"要素にxsd:schemaを追加します。これは、XSDでローカルに宣言されている場合、有効なXMLはターゲット名前空間に要素を配置する必要があることを意味します。それ以外の場合、有効なXMLは、ローカルに宣言された要素を名前空間に配置しないでください。
  • ごく少数の時間:assignmentが名前空間に属さないというXSDの要件に準拠するようにXMLを変更します。これは、たとえば、xmlns=""assignment要素に追加することで実現できます。
38
kjhughes

ElementFormDefaultで重要な点は、locally定義された要素、通常はcomplexTypeブロック内の名前付き要素に適用されることです。スキーマのレベル。 elementFormDefault = "qualified"を使用すると、スキーマのターゲット名前空間をドキュメントのデフォルト名前空間として使用して、xmlドキュメント内からスキーマ内のローカル要素をアドレス指定できます。

実際には、elementFormDefault = "qualified"を使用して、ネストされたブロックで要素を宣言できます。そうでない場合は、最上位ですべての要素を宣言し、ref属性を使用してネストされた要素のスキーマでそれらを参照する必要があります。はるかにコンパクトなスキーマ。

XML Schema Primerのこのビットはそれについて語っています: http://www.w3.org/TR/xmlschema-0/#NS

12
stephan f

elementFormDefault = "qualified"は、スキーマドキュメント自体(.xsdファイル)の名前空間ではなく、XMLインスタンスドキュメント(.xmlファイル)の名前空間の使用を制御するために使用されます。

ElementFormDefault = "qualified"を指定することにより、このスキーマで検証されたドキュメントで使用される名前空間宣言を強制します。

一般に、この値を指定して、要素を非修飾ではなく修飾する必要があることを宣言します。ただし、attributeFormDefault = "unqualified"はデフォルト値であるため、名前空間を修飾したくない場合は、スキーマドキュメントで指定する必要はありません。

5
Feri

ElementFormDefault = "qualified"が使用されている場合、XMLSpy(少なくとも2011バージョン)にはtargetNameSpaceが定義されている必要があることに気付きました。そうしないと検証されません。また、名前空間の接頭辞を持つXMLを生成しません

0
Neal