مخطط XML بناء على "أي واحد أو أكثر من هذه العناصر ولكن يجب أن يكون واحد على الأقل"

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

  •  01-07-2019
  •  | 
  •  

سؤال

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

حاولت القيام بما يلي ، ولكن XMLSpy يشكو من أن "محتوى النموذج يحتوي على عناصر <element name="DateConstant"> و <element name="DateConstant"> التي لا يمكن تحديدها بشكل فريد.":

    <xs:choice>
        <xs:sequence>
            <xs:element name="DateConstant"/>
            <xs:element name="TimeConstant"/>
        </xs:sequence>
        <xs:element name="DateConstant"/>
        <xs:element name="TimeConstant"/>
    </xs:choice>

يمكن القيام بذلك ( ، )?

بعض التوضيحات:أريد فقط أن تسمح واحدة من كل عنصر من نفس الاسم.يمكن أن يكون هناك واحد "DateConstant" و/أو "TimeConstant" ، ولكن ليس اثنين إما.الأداة الجواب يطابق متطلبات بلدي, لكنه غير عملي على عدد أكبر من العناصر.هيرست الجواب يسمح اثنين أو أكثر من العناصر من نفس الاسم الذي لا أريد.

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

المحلول

جرب هذا:

<xs:choice>
  <xs:sequence>
    <xs:element name="Elem1" />
    <xs:element name="Elem2" minOccurs="0" />
    <xs:element name="Elem3" minOccurs="0" />
  </xs:sequence>
  <xs:sequence>
    <xs:element name="Elem2" />
    <xs:element name="Elem3" minOccurs="0" />
  </xs:sequence>
  <xs:element name="Elem3" />
</xs:choice>

يمكنك القوة إما أن تختار العنصر الأول ثم بقية اختياري ، أما العنصر الثاني و الباقي اختياري ، أما العنصر الثالث.

هذا ينبغي أن تفعل ما تريد ، آمل.

بالطبع يمكنك أن تضع سلاسل فرعية في مجموعات ، لتجنب تكرار عنصر في كل تسلسل إذا كنت أدرك أن كنت يغيب واحد.

نصائح أخرى

وفقا التقنية المادة على MSDN بعنوان فهم مخطط XML في http://msdn.microsoft.com/en-us/library/aa468557.aspx#understandxsd_topic5 يمكنك الاستفادة من القيود مثل minOccurs على اختيار تعريف (المنضد) نفسها:

"باستخدام حدوث القيود على المنضد ينطبق على كامل الفريق ككل"

(انظر أكثر تطورا سبيل المثال يستخدم المتداخلة المعقدة أنواع AuthorType سبيل المثال)

هل ذكر الشرط الخاص بك مثل "واحد على الأقل من العناصر يجب أن تكون موجودة ويمكن أن يكون هناك أكثر من واحد منهم".وبالتالي أقترح عليك تجربة ما يلي:

<xs:choice minOccurs="1" maxOccurs="unbounded">
    <xs:element name="DateConstant" type="..."/>
    <xs:element name="TimeConstant" type="..."/>
</xs:choice>

@هيرست ،

للأسف أنت لم تفهم السؤال الأصلي.وضع minOccurs="1" على اختيار اقتنعت تلقائيا عند جميع العناصر التي minOccurs="0" وترد الخيارات.

وبالتالي كنت قد فشلت في حساب "واحد على الأقل" المطلوبة من قبل الناشر الأصلي ، لأن أي العناصر بشكل صحيح يرضي 1 occurrance اثنين من اختياري تماما العناصر.

حتى الآن أنا غير قادر على العثور على حل هذا minOccur/maxOccur كل من تتصل مجموعة تعريفها و لا تتصل إجمالي عدد العقد.ولا يمكنك استخدام عنصر الاختيار لتحديد نفس اسمه عنصر أكثر من مرة أو يصبح "غامضة".لقد رأيت بعض الأمثلة على استخدام المراجع بدلا من العناصر من نوع معين ، ولكن أعتقد أن هذا فشل microsoft XSD محلل.

<xs:choice minOccurs="1" maxOccurs="1">
  <xs:sequence minOccurs="1" maxOccurs="1">
    <xs:element name="Elem1" minOccurs="1" maxOccurs="1" />
    <xs:element name="Elem2" minOccurs="0" maxOccurs="1" />
  </xs:sequence>
  <xs:sequence >
    <xs:element name="Elem2" minOccurs="1" maxOccurs="1" />
  </xs:sequence>
</xs:choice>

هنا يمكنك أن ترى أنه إما أن يكون تسلسل الأول (الذي يجب أن يكون Elem1 ولكن قد يكون Elem2 اختياريا) ، أو لديك التسلسل الثاني (الذي يجب أن يكون Elem2).

ومن ثم لديك الآن "أي واحد أو أكثر" من هذه 2 من العناصر.طبعا هذا يحصل أضعافا مضاعفة أكثر تعقيدا والمزيد من الخيارات لديك كما تحتاج إلى توفير مزيد من الخيارات في جميع التوليفات الممكنة.

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