elementFormDefault ทำอะไรใน XSD


92

ใช้elementFormDefaultทำอะไรและควรใช้เมื่อใด

ดังนั้นฉันจึงพบคำจำกัดความของelementFormDefaultค่า:

คุณสมบัติ - องค์ประกอบและแอตทริบิวต์อยู่ใน targetNamespace ของสคีมา

ไม่มีเงื่อนไข - องค์ประกอบและแอตทริบิวต์ไม่มีเนมสเปซ

ดังนั้นจากคำจำกัดความดังกล่าวฉันคิดว่าถ้าสคีมาถูกตั้งค่าเป็นคุณสมบัติแล้วทำไมคุณต้องนำหน้าประเภทด้วยเนมสเปซ และสถานการณ์ใดบ้างที่คุณจะมีชุดเดียวที่ไม่มีคุณสมบัติเหมาะสมสำหรับเรื่องนั้น? ฉันลองใช้ Googling แต่สิ่งที่ฉันได้รับคือหน้า 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>

คำตอบ:


74

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 ที่คุณประกาศไว้ที่ด้านบนสุดของสคีมาจะใช้กับองค์ประกอบในเอกสาร XML ที่เข้ากันได้กับสคีมาเท่านั้นหาก elementFormDefault เป็น "คุณสมบัติ" หรือองค์ประกอบถูกประกาศอย่างชัดเจนในสคีมาว่ามี form = "คุณสมบัติ" .

ตัวอย่างเช่น: ถ้า elementFormDefault ไม่มีคุณสมบัติ -

<element name="name" type="string" form="qualified"></element>
<element name="page" type="target:TypePage"></element>

จะคาดหวังให้อิลิเมนต์ "name" อยู่ในอิลิเมนต์ targetNamespace และ "page" อยู่ในเนมสเปซว่าง

เพื่อช่วยให้คุณไม่ต้องใส่ form = "qualified" ในการประกาศองค์ประกอบทุกครั้งการระบุ elementFormDefault = "มีคุณสมบัติ" หมายความว่า targetNamespace ใช้กับแต่ละองค์ประกอบเว้นแต่จะถูกแทนที่ด้วยการใส่ form = "unqualified" ในการประกาศองค์ประกอบ


แม้ว่าคำตอบนี้อ้างถึงข้อมูลจำเพาะ แต่ก็แปลความหมายไม่ถูกต้อง อิลิเมนต์ที่กำหนดภายในเครื่องยังคงอยู่ใน targetNamespace และจะไม่อยู่ในเนมสเปซว่าง elementFormDefault เป็นเพียงสวิตช์ที่ระบุว่าคุณควรกำหนดให้เนมสเปซมีคุณสมบัติในอินสแตนซ์หรือไม่
Ihe Onwuka

1
@ ฉันไม่ถูกต้อง: หรือไม่ว่าในกรณีใด ๆ ก็อาจทำให้ผู้คนสับสนได้ หากการประกาศองค์ประกอบภายในเครื่องไม่มี form = คุณสมบัติคุณสมบัติ {target namespace} ขององค์ประกอบสคีมาการประกาศองค์ประกอบจะ "ไม่มี" และนั่นหมายความว่าคุณสมบัติ URI ของเนมสเปซของอินสแตนซ์องค์ประกอบจะต้อง "ไม่มีอยู่ด้วย
Michael Kay

@MichaelKay สำหรับฉันที่ยิ่งสับสน คำถามคือว่าในหน้าตัวอย่างอยู่ในเนมสเปซว่างหรือไม่เพราะถ้าเป็นเหตุใดข้อมูลจำเพาะจึงไม่เพียงแค่พูดว่าการตั้งค่า elementFormDefault = ไม่มีเงื่อนไขจะทำให้องค์ประกอบที่กำหนดไว้ในเครื่องในเนมสเปซว่าง กำลังบอกว่าเพจไม่ควรเป็นเนมสเปซที่ผ่านการรับรองในอินสแตนซ์เช่นเดียวกับการบอกว่าเพจนั้นไม่มีเนมสเปซ cos ถ้าเป็นเพราะเหตุใดสเป็กจึงไม่พูดอย่างนั้นและเหตุใดสคีมาที่มี targetNamespace จึงตรวจสอบสิ่งที่ไม่ใช่ ในเนมสเปซนั้น?
Ihe Onwuka

1
ไม่ใช่ "พูดอย่างนั้น" เพราะคุณกำลังอธิบายอย่างไม่เป็นทางการ: วลี "การใส่องค์ประกอบในเนมสเปซว่าง" ไม่ได้ใช้คำศัพท์เฉพาะของข้อกำหนด XSD ข้อมูลจำเพาะชอบใช้คำศัพท์ที่ระมัดระวังมากกว่าซึ่งมักทำให้อ่านยาก แต่ท้ายที่สุดแล้วแม่นยำกว่ามาก
Michael Kay

1
เท่าที่ฉันกังวลมันเป็นคำตอบที่ถูกต้องตามที่เขียนไว้
Michael Kay

61

พิจารณา 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>

อนุญาตให้ใช้แอตทริบิวต์ชื่อผู้แต่งโดยไม่ต้องระบุเนมสเปซ (ไม่มีเงื่อนไข) องค์ประกอบใด ๆ ที่เป็นส่วนหนึ่ง<xsd:complexType>จะถูกพิจารณาว่าเป็นแบบ local to complexType

ถ้า elementFormDefault="qualified"

จากนั้นอินสแตนซ์ควรมีองค์ประกอบภายในที่ผ่านการรับรอง

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

โปรดดูลิงค์นี้เพื่อดูรายละเอียดเพิ่มเติม


57

ใหม่คำตอบโดยละเอียดและคำอธิบายสำหรับคำถามเก่าที่พบบ่อย ...

คำตอบสั้น ๆ : หากคุณไม่ได้เพิ่มelementFormDefault="qualified"ไปxsd:schemaแล้วเริ่มต้นunqualifiedหมายถึงค่าที่องค์ประกอบประกาศในประเทศอยู่ในnamespace ไม่

มีความสับสนมากมายเกี่ยวกับสิ่งที่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 จะไม่มีเนมสเปซตามค่าเริ่มต้น
    • นี้เป็นเพราะค่าเริ่มต้นสำหรับเป็นelementFormDefaultunqualified
    • เนื้อหานี้เป็นความผิดพลาดในการออกแบบของผู้สร้าง 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>

ข้อสังเกต:

  • เนมสเปซดีฟอลต์บนassignmentsplaces assignmentsและhttp://www.levijackson.net/web340/nsลำดับถัดไปทั้งหมดในเนมสเปซเริ่มต้น ( )

ข้อผิดพลาดในการตรวจสอบที่น่างงงวย

แม้จะดูถูกต้อง แต่ XML ข้างต้นให้ข้อผิดพลาดในการตรวจสอบความถูกต้องที่สับสนดังต่อไปนี้:

[ข้อผิดพลาด] try.xml: 4: 23: cvc-complex-type.2.4.a: พบเนื้อหาที่ไม่ถูกต้องเริ่มต้นด้วยองค์ประกอบ "การกำหนด" คาดว่าจะมี "{assignment}" หนึ่งรายการ

หมายเหตุ:

  • คุณคงไม่ใช่นักพัฒนารายแรกที่สาปแช่งการวินิจฉัยนี้ที่ดูเหมือนจะบอกว่าเนื้อหาไม่ถูกต้องเนื่องจากคาดว่าจะพบassignmentองค์ประกอบ แต่พบassignmentองค์ประกอบจริง ( WTF )
  • สิ่งนี้หมายความว่าอย่างไร: {และ}รอบ ๆassignmentหมายความว่าการตรวจสอบความถูกต้องคาดว่าจะassignment ไม่มีเนมสเปซที่นี่ น่าเสียดายที่เมื่อระบุว่าพบassignmentองค์ประกอบก็ไม่ได้ระบุว่าพบในเนมสเปซเริ่มต้นซึ่งแตกต่างจากไม่มีเนมสเปซ

วิธีการแก้

  • เวลาส่วนใหญ่:เพิ่มelementFormDefault="qualified"ในxsd:schemaองค์ประกอบของ XSD ซึ่งหมายความว่า XML ที่ถูกต้องจะต้องวางองค์ประกอบในเนมสเปซเป้าหมายเมื่อมีการประกาศภายใน XSD มิฉะนั้น XML ที่ถูกต้องจะต้องวางองค์ประกอบที่ประกาศในเครื่องโดยไม่มีเนมสเปซ
  • เวลาส่วนน้อย:เปลี่ยน XML เพื่อให้สอดคล้องกับข้อกำหนดของ XSD ที่assignmentไม่มีเนมสเปซ นี้สามารถทำได้เช่นโดยการเพิ่มxmlns=""ไปยังassignmentองค์ประกอบ

เครดิต:ขอบคุณMichael Kayสำหรับคำติชมที่เป็นประโยชน์เกี่ยวกับคำตอบนี้


13

สิ่งสำคัญที่ควรทราบด้วย elementFormDefault คือใช้กับองค์ประกอบที่กำหนดในเครื่องโดยทั่วไปจะมีชื่อองค์ประกอบภายในบล็อก complexType ซึ่งตรงข้ามกับองค์ประกอบส่วนกลางที่กำหนดไว้ในระดับบนสุดของสคีมา ด้วย elementFormDefault = "มีคุณสมบัติ" คุณสามารถระบุองค์ประกอบโลคัลในสคีมาจากภายในเอกสาร xml โดยใช้เนมสเปซเป้าหมายของสคีมาเป็นเนมสเปซเริ่มต้นของเอกสาร

ในทางปฏิบัติให้ใช้ elementFormDefault = "มีคุณสมบัติ" เพื่อให้สามารถประกาศองค์ประกอบในบล็อกที่ซ้อนกันมิฉะนั้นคุณจะต้องประกาศองค์ประกอบทั้งหมดในระดับบนสุดและอ้างถึงองค์ประกอบในสคีมาในองค์ประกอบที่ซ้อนกันโดยใช้แอตทริบิวต์ ref ซึ่งส่งผลให้ สคีมาขนาดกะทัดรัดน้อยกว่ามาก

บิตนี้ใน XML Schema Primer พูดถึง: http://www.w3.org/TR/xmlschema-0/#NS


ชี้แจงเล็กน้อยเกี่ยวกับคำตอบที่ถูกต้องที่สุด ด้วย elementFormDefault = คุณสมบัติคุณต้องทำให้เนมสเปซตรวจสอบคุณสมบัติของอิลิเมนต์โลคัลในอินสแตนซ์ ด้วยการตั้งค่าให้ไม่มีคุณสมบัติคุณจะต้องไม่มีเนมสเปซที่มีคุณสมบัติเหมาะสม
Ihe Onwuka

6

elementFormDefault = "มีคุณสมบัติ" ใช้เพื่อควบคุมการใช้เนมสเปซในเอกสารอินสแตนซ์ XML (ไฟล์. xml) แทนที่จะเป็นเนมสเปซในเอกสารสคีมา (ไฟล์. xsd)

โดยการระบุ elementFormDefault = "มีคุณสมบัติ" เราบังคับใช้การประกาศเนมสเปซเพื่อใช้ในเอกสารที่ตรวจสอบความถูกต้องด้วยสคีมานี้

เป็นเรื่องปกติที่จะระบุค่านี้เพื่อประกาศว่าองค์ประกอบควรมีคุณสมบัติมากกว่าไม่มีคุณสมบัติ อย่างไรก็ตามเนื่องจาก attributeFormDefault = "unqualified" เป็นค่าดีฟอลต์จึงไม่จำเป็นต้องระบุไว้ในเอกสาร schema หากไม่ต้องการคุณสมบัติเนมสเปซ


elementFormDefault ใช้กับองค์ประกอบที่กำหนดในเครื่องเท่านั้น องค์ประกอบส่วนกลางต้องมีการกำหนดเนมสเปซที่ผ่านการรับรองไม่ว่า
Ihe Onwuka

0

ฉันสังเกตเห็นว่า XMLSpy (อย่างน้อยเวอร์ชัน 2011) ต้องการ targetNameSpace ที่กำหนดหากใช้ elementFormDefault = "คุณสมบัติ" มิฉะนั้นจะตรวจสอบไม่ได้ และจะไม่สร้าง xml ที่มีคำนำหน้าเนมสเปซ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.