XML-Schema für die Reihenfolge der Elemente mit gleichem Namen, aber unterschiedlichen Attributwerten?
Wie kann ich angeben, wird ein XML-schema für eine Instanz-Dokument wie dieses:
<productinfo>
<!-- other stuff -->
<informationset type="Manufacturer">
<!-- content not relevant -->
</informationset>
<informationset type="Ingredients">
<!-- content not relevant -->
</informationset>
</productinfo>
ist, eine "productinfo" - element enthält eine Sequenz von zwei "informationset" Kinder, das erste mit @type="Manufacturer"
und das zweite hatte @type="Ingredients"
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
HINWEIS diese Antwort ist falsch, wie Serge hingewiesen.
Tests mit xerces gibt diese Fehlermeldung:
type.xsd:3:21: cos-element-consistent: Error for type '#AnonType_productinfo'. Multiple elements with name 'informationset', with different types, appear in the model group.
Es gibt mehr Details in der Spezifikation für cos-element-einheitliche.Aber es gibt eine Lösung, ähnlich wie Marc, die Antwort unten, aber immer noch mit den Typen. Es ist möglich, mehrere vorkommen desselben mit verschiedenen Typen, wenn Sie in einer minOccurs - /maxOccurs-Liste ein Supertyp, der verlängert sich um den anderen Typen. Das ist, genau wie eine Liste von polymorphen Klassen in java oder C#. Dies überwindet das problem vor, denn obwohl dieses element kann der name erscheint mehrfach in der xml, erscheint es nur einmal in der xsd.
Hier ist Beispiel-xsd-und xml - getestet mit xerces dieser Zeit!:
HINWEIS: Sie können nicht kontrollieren, die um der verschiedenen Arten, oder wie oft jeder Typ vorkommt (jedes erscheinen könnte, einmal, mehrmals oder überhaupt nicht angezeigt werden) - genauso wie mit einer Liste von polymorphen Klassen in java oder C#. Aber man kann zumindest angeben, auf die exakte Länge der Liste insgesamt (wenn Sie möchten).
Ich habe zum Beispiel beschränkt sich das obige Beispiel genau zwei Elemente, aber die Reihenfolge ist nicht festgelegt (d.h. Hersteller konnte der erste sein, oder Zutaten konnte der erste sein); und die Anzahl der Wiederholungen ist nicht gesetzt (d.h. Sie könnten beide Hersteller, oder beide Zutaten, oder eins von jedem).
Können Sie mit XML-Schema Typ, in:
Und die XSD definiert separate komplexe Typen für jeden:
Dies ist ein spezieller Fall für
xsi:type
. Im Allgemeinen, glaube nicht, können Sie angeben von Attributen mit unterschiedlichen Werten in Elementen mit dem gleichen Namen, weil Sie unterschiedliche Definitionen des gleichen Elements.Bin ich mir nicht 100% klar über die genauen Grund - wer weiß, den entsprechenden Teil der spec?
xmllint
(nimmt es); aber die Tests mit dem strengerenxerces
gibt einen ähnlichen Fehler, was Sie bekam:type.xsd:3:21: cos-element-consistent: Error for type '#AnonType_productinfo'. Multiple elements with name 'informationset', with different types, appear in the model group.
Suchen Sie diese in der Skillung geben mehr detail w3.org/TR/2004/REC-xmlschema-1-20041028/...Könnten Sie versuchen, so etwas wie dieses, erstellen Sie eine separate complexType für Ihre "informationSet" Elemente, und beschränken Sie das Attribut, um eine Liste Gültiger Zeichenketten:
Natürlich, Sie können erweitern, die Liste der gültigen Attribut-Namen, wenn Sie möchten - ergänzen Sie einfach weitere Elemente des restriction-enumeration Liste.
Marc
Mit Assertion-Schema-Komponente
Dank XML-Schema 1.1, es ist ein Weg zur Durchsetzung Ihrer Forderung die zimmerreserviereung, ohne das importieren derArt alternativen , die Bereitstellung der
xsi
namespace und hack Polymorphismus in Ihr XML-Dokument. XML Schema 1.1 brachte zwei neue Komponenten, Behauptungen undxs:assert
undxs:alternative
Elemente. Sie haben eine@test
- Attribut, in dem die Bedingungen und Einschränkungen festgelegt werden, wie von XPath 2.0-Ausdrücken.Obwohl
xs:alternative
soll offensichtlich die Lösung für dein problem, ich für meinen Teil habe es noch nicht gelungen, bei der Vergabe von alternative, Typen basierend auf ein element die position. (Die schema-parser das Verständnis von Knoten-Kontexten scheint, unterscheiden sich von den einen würde ich erwarten, dass auf der Grundlage der validierten XML-Dokument-Struktur.)Sowieso, können Sie erzwingen, Ihre Einschränkungen mit
xs:assert
:Den Einsatz von Attribut
@xpathDefaultNamespace
nicht notwendig sein, wenn Sie Ihre schema-Namensraum ist null, aber muss eingestellt werden##targetNamespace
wenn Sie schema definiert, andernfalls ist die Bewertung der element-Namen fehl.Kann sein, dass http://xsd.stylusstudio.com/2001Aug/post03013.htm ist, was Sie suchen.
In VS, meldet einen Fehler: Elemente mit dem gleichen Namen und im gleichen Umfang müssen denselben Typ haben.
Ich denke, XSD, können nicht erfüllen Ihre Anforderung, können Sie versuchen, es zu lösen aus einer anderen Richtung.zum Beispiel die Verwendung von xslt zur Validierung von XML. XSLT wird xpath-basierte und Regel-basiert ist, kann es überprüfen Sie alle Orte, die im xml-Format.
XSD + XSLT ist eine gute Lösung, XSD-Schemas überprüfen, XSLT für die Informationen zu überprüfen.