هل يصح أن يكون 'الخيار' من 'مجموعة' العناصر عند تعريف مخطط XML (XSD)

StackOverflow https://stackoverflow.com/questions/101338

  •  01-07-2019
  •  | 
  •  

سؤال

هل يصح أن يكون 'الخيار' أو 'مجموعة' العناصر عند تعريف مخطط XML (XSD)

أيهي التالية صحيحة

<xs:complexType name="HeaderType">
  <xs:sequence>
    <xs:element name="reservation-number" type="ReservationNumberType" minOccurs="1" maxOccurs="1" nillable="false" />
    <xs:choice minOccurs="1" maxOccurs="1">
      <xs:group ref="ReservationGroup" />
      <xs:group ref="CancellationGroup"/>
    </xs:choice>
  </xs:sequence>
</xs:complexType>

حيث XML رسالة يمكن أن تمثل ، على سبيل المثال ، إما حجز جديد أو إلغاء الحجز المسبق.

إذا كانت الرسالة التحفظ ، ثم يجب أن تشمل جميع العناصر المحددة في ReservationGroup المجموعة.

إذا كان الإلغاء ، ثم يجب أن تشمل جميع العناصر المحددة في CancellationGroup المجموعة.

لسبب ما, يا محرر XML (الكسوف) لا مثل هذا, ولكن لا يشير إلى السبب.فإنه يدل على وجود خطأ على خط <xs:complexType name="HeaderType"> ولكن لا يقول ما الخطأ

هل كانت مفيدة؟

المحلول

أنا لا XML الخبراء ، على الرغم من أنني استخدامه الكثير جدا.ليست هذه هي الطريقة التي كنت تفعل عادة هذا النوع من الهيكل.وأود أن تفضل منفصلة أنواع معقدة بدلا من خيار من اثنين من مجموعات (انظر نهاية هذا الرد).

وأظن أن المشكلة هي أن ReservationGroup و CancellationGroup تبدأ مع نفس العنصر ، في هذه الحالة سوف تنتهك مخطط مكون القيد:فريدة من نوعها الجسيمات الإسناد (أدناه).

http://www.w3.org/TR/2004/REC-xmlschema-1-20041028/#cos-nonambig

مخطط مكون القيد:فريدة من نوعها الجسيمات الإسناد

محتوى نموذج يجب تشكيل هذه خلال ·التحقق· من عنصر المعلومات البند تسلسل الجسيمات المكونة الواردة بشكل مباشر ، أو غير مباشر ، ·ضمنا· فيه مع محاولة ·صحة· كل عنصر في تسلسل بدوره يمكن أن يكون فريد قرر دون دراسة المحتوى أو سمات هذا البند ، ودون أي معلومات عن العناصر في ما تبقى من التسلسل.

ملاحظة: هذا القيد يعيد عن مخطط XML من أي ما يعادل القيود [XML 1.0 (الطبعة الثانية)] و SGML.نظرا وجود عنصر الاستبدال مجموعات أحرف البدل ، موجزة ، التعبير عن هذا القيد هو من الصعب انظر تحليل فريدة من نوعها الجسيمات الإسناد القيد (غير المعيارية) (§ح) لمزيد من مناقشة.

على سبيل المثال ، المجموعتين أدناه هي غير قانونية في نفس الاختيار ، لأن كل من العنصر الأول هو "اسم" وهو ما يعني أنه لا يمكنك تحديد المجموعة التي كنت تبحث في.ومع ذلك هو العنصر الأول من ReservationGroup يختلف عن إلغاء مجموعة (resDate و cancDate ربما) ، ثم صالح.

تحرير: أنا لم تأتي عبر هذا النوع من المشاكل من قبل و أعتقد رائعة أن التعاريف من المجموعات هي قانونية تماما ، ولكن إذا وضعت معا في اختيار هذا الخيار يصبح غير قانوني لأن من تعريف كل مجموعة.

المجموعات التي لا يمكن أن تشكل القانونية الاختيار

<xs:group name="ReservationGroup">
    <xs:sequence>
        <xs:element name="date"/>
        <xs:element name="name"/>
        <xs:element name="address"/>
    </xs:sequence>
</xs:group>

<xs:group name="CancellationGroup">
    <xs:sequence>
        <xs:element name="date"/>
        <xs:element name="name"/>
        <xs:element name="address"/>
    </xs:sequence>
</xs:group>

المجموعات التي يمكن أن تشكل القانونية الاختيار

<xs:group name="ReservationGroup">
    <xs:sequence>
        <xs:element name="resDate"/>
        <xs:element name="name"/>
        <xs:element name="address"/>
    </xs:sequence>
</xs:group>

<xs:group name="CancellationGroup">
    <xs:sequence>
        <xs:element name="cancDate"/>
        <xs:element name="name"/>
        <xs:element name="address"/>
    </xs:sequence>
</xs:group>

كما ذكرت أعلاه ، أود أن تفعل هذا النوع من الشيء مع أنواع معقدة.نعم, أنه يضيف عنصرا آخر ، ولكن يبدو طريقة واضحة و أحب البداهة.

<xs:complexType name="HeaderType">
  <xs:sequence>
    <xs:element name="reservation-number" type="ReservationNumberType" minOccurs="1" maxOccurs="1" nillable="false" />
    <xs:choice minOccurs="1" maxOccurs="1">
      <xs:element name="reservation" type="ReservationType" />
      <xs:element name="cancellation" type="CancellationType" />
    </xs:choice>
  </xs:sequence>
</xs:complexType>

نصائح أخرى

نعم.كان لأن كلا من ReservationGroup و CancellationGroup نفس العنصر الأول - وهو تحفظ من نوع' عنصر مع قيمة ثابتة من "التحفظ" في ReservationGroup و 'إلغاء' في Cancellationgroup على التوالي.

إذا كان هذا هو صالح يعتمد على محتوى مجموعات:لو انهم 'سلسلة' أو 'اختيار' نموذج الجماعات إنه قانوني تماما ، 'جميع' نموذج المجموعات هي أكثر صعوبة و عموما لا يسمح في هذه الحالة.

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