elementFormDefaultはXSDで何をしますか?


88

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

だから私はelementFormDefault値のいくつかの定義を見つけました:

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

unqualified-要素と属性に名前空間がありません

したがって、その定義から、スキーマが修飾に設定されている場合、なぜタイプの前に名前空間を付ける必要があるのでしょうか。そして、あなたがその問題のために不適格に設定することさえできるシナリオは何ですか?グーグルを試してみましたが、非常に理解しにくいW3Cページしかありませんでした。

これは私が現在使用しているファイルですが、と同じものとしてtarget:TypeAssignments宣言するときにタイプを宣言する必要があるのはなぜですか?targetNamespacexmlns: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>

回答:


71

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が「修飾」されているか、要素がスキーマで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が各要素に適用されます。


この回答は仕様を参照していますが、正しく解釈されていません。ローカルで定義された要素は引き続きtargetNamespaceにあり、null名前空間にはありません。elementFormDefaultは、インスタンスでそれらを名前空間で修飾するかどうかを指定する単なるスイッチです。
Ihe Onwuka

1
@Ihe、それは正しくありません:またはとにかく、それは人々を混乱させる傾向があります。ローカル要素宣言が修飾形式を=ていない場合は、要素宣言スキーマコンポーネントの{ターゲット名前空間}プロパティが「不在」であり、手段、要素インスタンスの名前空間URIプロパティはまた、「不在でなければならない。
マイケル・ケイ

@MichaelKay私にとって、それはさらに混乱を招きます。問題は、例のページでnull名前空間にあるかどうかです。それが理由である場合、仕様では単にelementFormDefault = unqualifiedを設定すると、ローカルで定義された要素がnull名前空間に配置されるとは言えません。ページがインスタンスで名前空間修飾されるべきではないと言っているのは、ページが名前空間cosにないということと同じことです。それは、仕様が単にそれを述べていない理由であり、targetNamespaceを持つスキーマがそうでないものを検証している理由です。その名前空間で?
Ihe Onwuka

1
非常に非公式に説明しているため、「単にそれを言う」わけではありません。「要素をnull名前空間に配置する」というフレーズは、XSD仕様の用語を使用していません。仕様では、はるかに注意深い用語を使用することを好みます。これにより、読みにくくなることがよくありますが、最終的にははるかに正確になります。
マイケルケイ

1
私に関する限り、それは書かれている通りの正解です。
マイケルケイ

60

要素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>

作成者の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>

詳細については、このリンクを参照してください


55

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

短い答え:あなたは追加しない場合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です。これは、予想どおり、ターゲットの名前空間に含まれます。
  • これは、デフォルト値を確立formするxs:element宣言でめったに使用されない属性elementFormDefaultです。

一見有効な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}'の1つが必要です。

ノート:

  • あなたはassignment要素を見つけることを期待していたが実際には要素を見つけたためにコンテンツが無効であるとassignment言っているように見えるこの診断を呪う最初の開発者ではありませんWTF
  • これが実際に意味すること:{および}その周辺assignmentは、検証がここassignment の名前空間なしで期待さていことを意味します。残念ながら、assignment要素が見つかったと表示された場合、名前空間がない場合とは異なるデフォルトの名前空間で見つかったとは記載されていません。

解決

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

クレジット:おかげでマイケル・ケイこの回答に有用なフィードバックのために。


12

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

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

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


最も正確な答えのように見えるものについてのわずかな説明。elementFormDefault = qualifiedを使用すると、インスタンス内のローカル要素を名前空間で修飾する必要があります。unqualifiedに設定されている場合、名前空間で修飾してはなりません。
Ihe Onwuka

6

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

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

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


elementFormDefaultは、ローカルで定義された要素にのみ適用されます。グローバル要素は、名前空間で修飾する必要があります。
Ihe Onwuka

0

elementFormDefault = "qualified"が使用されている場合、XMLSpy(少なくとも2011バージョン)ではtargetNameSpaceを定義する必要があることに気付きました。それ以外の場合は検証されません。また、名前空間プレフィックスを持つxmlを生成しません

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.