هل من الممكن في لغة مخطط XML (XSD) الخاصة بـ W3C السماح بسلسلة من العناصر بأي ترتيب مع الحد من حدوثها؟

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

  •  01-07-2019
  •  | 
  •  

سؤال

وأنا أعلم عن all و choice, ، لكنها لا تأخذ في الاعتبار الحالة التي أرغب فيها في إمكانية حدوث بعض العناصر أكثر من مرة، مثل:

<Root>
    <ThingA/>
    <ThingB/>
    <ThingC/>
    <ThingC/>
    <ThingC/>
</Root>

يمكن أن أستخدم sequence, ، لكنني أفضل السماح لهؤلاء الأطفال بالتواجد بأي ترتيب.يمكن أن أستخدم any, ، ولكن بعد ذلك لم أستطع الحصول على أكثر من واحد ThingC.يمكن أن أستخدم choice, ، ولكن بعد ذلك لم أستطع الحد ThingA و ThingB إلى 0 أو 1.

أعتقد أنني ربما قرأت في مكان ما أن هذا كان صعبًا أو مستحيلًا في XSD، ولكن قد يكون ممكنًا مع RELAX NG.ولا أذكر أين قرأت ذلك للأسف.

شكرا على اي مساعدة!

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

المحلول

صحيح:لا يمكنك أن تفعل ما تريد القيام به في مخطط XML، ولكن يمكنك في RELAX NG باستخدام:

<element name="Root">
  <interleave>
    <element name="ThingA"><empty /></element>
    <element name="ThingB"><empty /></element>
    <oneOrMore><element name="ThingC"><empty /></element></oneOrMore>
  </interleave>
</element>

خياراتك في مخطط XML هي:

  • قم بإضافة خطوة معالجة مسبقة تعمل على تطبيع XML المدخل الخاص بك إلى ترتيب معين، ثم استخدمه <xs:sequence>
  • يستخدم <xs:choice>, ، وأضف التحقق الإضافي (على سبيل المثال باستخدام Schematron) للتأكد من عدم وجود أكثر من واحد <ThingA> أو <ThingB>
  • قرر إصلاح ترتيب العناصر في لغة الترميز الخاصة بك

وتبين أن الخيار الثالث هو عادة الخيار الأفضل؛عادةً لا تكون هناك تكلفة كبيرة لمولدات XML لإخراج العناصر بترتيب معين، ولا يساعد ذلك في التحقق من الصحة فحسب، بل يساعد أيضًا في استهلاك XML إذا كان من الممكن معرفة الترتيب مسبقًا.

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