102

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

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

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

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

したがって、その定義から、スキーマが修飾に設定されている場合、なぜタイプの前に名前空間を付ける必要があるのでしょうか。そして、あなたがその問題について無資格に設定することさえあるであろうシナリオは何ですか?グーグルを試してみましたが、非常に理解しにくい2つの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>
4

6 に答える 6

78

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 が各要素に適用されることを意味します。

于 2009-09-23T00:25:31.683 に答える
66

要素で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 に対してローカルと見なされます。

もしもelementFormDefault="qualified"

次に、インスタンスにはローカル要素が修飾されている必要があります

<x:author xmlns:x="http://example.org/publishing">
   <x:name>Aaron Skonnard</name>
   <x:phone>(801)390-4552</phone>
</x:author>

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

于 2014-05-04T05:54:53.820 に答える
15

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

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

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

于 2011-06-17T15:05:28.927 に答える
0

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

于 2011-07-22T09:52:52.337 に答える