Ist es möglich, in W3C XML Schema (XSD) einer Reihe von Elementen zu ermöglichen, in beliebiger Reihenfolge zu sein, aber nach wie vor Vorkommen begrenzen?

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

  •  01-07-2019
  •  | 
  •  

Frage

Ich weiß, über all und choice, aber sie berücksichtigen nicht für einen Fall, wo ich einige Elemente Sie wollen in der Lage sein, mehr als einmal auftreten, wie zum Beispiel:

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

kann ich sequence, aber ich würde es vorziehen, diese Kinder zu ermöglichen, in beliebiger Reihenfolge zu sein. Ich konnte verwenden any, aber dann konnte ich nicht mehr als ein ThingC haben. Ich kann choice verwenden, aber dann konnte ich nicht ThingA und ThingB auf 0 oder 1 begrenzen.

Ich glaube, ich irgendwo gelesen habe, dass diese entweder schwierig oder unmöglich in XSD war, aber vielleicht mit RELAX NG möglich sein. Ich erinnere mich nicht, wo ich gelesen, dass, leider.

Vielen Dank für jede Hilfe!

War es hilfreich?

Lösung

Das ist richtig: Sie können nicht tun, was Sie in XML-Schema tun mögen, aber Sie können in RELAX NG mit:

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

Ihre Optionen in XML-Schema sind:

  • fügen Sie einen Vorverarbeitungsschritt, die Ihre Eingabe von XML in einer bestimmten Reihenfolge normalisieren, und verwenden Sie dann <xs:sequence>
  • Verwendung <xs:choice> und zusätzliche Validierung hinzuzufügen (zum Beispiel unter Verwendung von Schematron) zu überprüfen, dass es nicht mehr als ein <ThingA> oder <ThingB>
  • entscheidet die Reihenfolge der Elemente in der Auszeichnungssprache zu beheben

Es stellt sich heraus, dass der dritte ist in der Regel die beste Option; gibt es in der Regel nicht viele Kosten für Generatoren von XML Ausgabeelementen in einer bestimmten Reihenfolge, und nicht nur sie Validierung hilft, aber es hilft auch Verbrauch des XML, wenn der Auftrag im Voraus bekannt sein kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top