سؤال

ماذا فعلت elementFormDefault القيام به، ومتى يجب استخدامه؟

لذلك وجدت بعض التعاريف ل elementFormDefault القيم:

تأهلت - العناصر والسمات موجودة في مساحة المستهدفة من المخطط

غير مؤهل - العناصر والسمات لا تملك مساحة اسم

لذلك من هذا التعريف، أعتقد أنه إذا تم تعيين مخطط مؤهل، فلماذا يجب عليك بادئة النوع باستخدام مساحة الاسم؟ وما هي السيناريوهات التي ستكون لديك حتى مجموعة واحدة غير مؤهل لهذا الأمر؟ لقد حاولت 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>
هل كانت مفيدة؟

المحلول

لا علاقة له ElectormDefault بأي شيء بمساحة الاسم من الأنواع في المخطط، فهو يدور حول مساحات أسماء العناصر في مستندات 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·.

ما يعني ذلك هو أن المستهدف الذي أعلته في الجزء العلوي من المخطط فقط ينطبق فقط على العناصر في مستند XML المتوافق مع المخطط إذا كان إما ElectormDefault هو "مؤهل" أو يتم الإعلان عن العنصر بشكل صريح في المخطط بأنه يحتوي على نموذج = "مؤهل" وبعد

على سبيل المثال: إذا كان ElectormDefault غير مؤهل -

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

سيتوقع أن تكون العناصر "الاسم" لتكون في عناصر المستهدف و "الصفحة" في مساحة الاسم NULL.

لحفظ الاضطرار إلى وضع نموذج = "مؤهل" على كل إعلان عناصر، توضح ElementFormDefault = "المؤهل" يعني أن المستهدف ينطبق على كل عنصر ما لم يتم تجاوزه عن طريق وضع النموذج = "غير مؤهل" على إعلان العنصر.

نصائح أخرى

النظر في 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> تعتبر المحلية لتحميل النمط.

إذا 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: تم العثور على محتوى غير صالح بدءا من العناصر "المهمة". من المتوقع واحدا من '{المهمة}'.

ملاحظات:

  • لن تكون أول مطور لعن هذا التشخيص الذي يبدو أنه يقول ذلك المحتوى غير صالح لأنه من المتوقع أن تجد assignment عنصر ولكن وجدت بالفعل assignment جزء. (ماهذا الهراء)
  • ماذا يعني هذا حقا: { و } حول assignment يعني أن التحقق من الصحة كان يتوقع assignment في مساحة الاسم هنا. لسوء الحظ، عندما تقول أنه وجد assignment العنصر، لا يذكر أنه وجدته في مساحة اسم افتراضية يختلف عن مساحة الاسم.

المحلول

  • الغالبية العظمى من الوقت: يضيف elementFormDefault="qualified" إلى xsd:schema عنصر XSD. هذا يعني أن XML صالح يجب وضع العناصر في مساحة الاسم المستهدفة عند الإعلان محليا في XSD؛ خلاف ذلك، يجب أن تضع XML صالح العناصر المعلنة محليا في مساحة الاسم.
  • أقلية صغيرة من الوقت: تغيير XML للامتثال لمتطلبات XSD ذلك assignment لا يكون في مساحة الاسم. يمكن تحقيق ذلك، على سبيل المثال، عن طريق إضافة xmlns="" إلى assignment جزء.

من المهم أن نتحدث مع ElectormDefault هو أنه ينطبق عليه محليا العناصر المحددة، والتي تسمى عادة عناصر داخل كتلة Complextype، بدلا من العناصر العالمية المحددة على المستوى الأعلى للمخطط. باستخدام ElectormDefault = "مؤهل"، يمكنك معالجة العناصر المحلية في المخطط من داخل مستند XML باستخدام مساحة الاسم المستهدفة في المخطط كاسم المسام الافتراضي للمستند.

في الممارسة العملية، استخدم ElementFormDefault = "مؤهل" لتكون قادرا على إعلان عناصر في كتل متداخلة، وإلا فسيتعين عليك إعلان جميع العناصر على المستوى الأعلى وأحرف عليها في المخطط في العناصر المتداخلة باستخدام سمة المرفأ، مما يؤدي إلى مخطط أقل مدمجة بكثير.

هذا الشيء في XML Schema Primer يتحدث عن ذلك: http://www.w3.org/tr/xmlschema-0/#NS.

يستخدم ElementFormDefault = "المؤهل" للتحكم في استخدام مساحات الأسماء في مستندات مثيل XML (ملف .xml)، بدلا من مساحات الأسماء في وثيقة المخطط نفسها (ملف .xsd).

من خلال تحديد ElementFormDefault = "مؤهل" نحن نفرض إعلان مساحة الاسم لاستخدامه في المستندات التي تم التحقق منها مع هذا المخطط.

من الممارسات الشائعة تحديد هذه القيمة للإعلان عن أن العناصر يجب أن تكون مؤهلة بدلا من غير مؤهل. ومع ذلك، نظرا لأن AttributeFormDefault = "غير مؤهل" هو القيمة الافتراضية، فلا يحتاج إلى تحديدها في مستند المخطط، إذا كان المرء لا يريد تأهل مساحات الأسماء.

لقد لاحظت أن XMLSPY (إصدار على الأقل لعام 2011) يحتاج إلى مساحة تتراكم محددة إذا تم استخدام ElectormDefault = "المؤهل". خلاف ذلك لن تتحقق. وكذلك لن تولد XMLs بادئة مساحة الاسم

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top