XML-Schema für eine Sequenz von Elementen mit demselben Namen, aber unterschiedlichen Attributwerten?

8

Wie kann ich ein XML-Schema für ein Instanzdokument wie folgt angeben:

%Vor%

Das heißt, ein "productinfo" -Element, das eine Folge von zwei "informationset" -Kindern enthält, wobei das erste @type="Manufacturer" und das zweite @type="Ingredients" ?

hat     
Abel 05.05.2009, 21:45
quelle

5 Antworten

3

HINWEIS Diese Antwort ist falsch, wie Serge schon sagte.

Beim Testen mit xerces wird folgender Fehler angezeigt: 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. Weitere Details finden Sie in der Spezifikation für cos-Element-konsistent .

Aber es gibt eine Lösung, ähnlich der Antwort von Marc unten, aber immer noch mit Typen. Es ist möglich, mehrere Vorkommen derselben mit unterschiedlichen Typen zu haben, wenn sie sich in einer minOccurs / maxOccurs-Liste eines Supertyps befinden, der um die anderen Typen erweitert wird. Das ist genau wie eine Liste von polymorphen Klassen in Java oder C #. Dadurch wird das obige Problem behoben, da dieser Elementname zwar mehrfach in der XML-Datei vorkommen kann, aber nur einmal in der XSD-Datei angezeigt wird.

Hier ist Beispiel xsd und xml - getestet mit xerces diesmal!:

%Vor%

HINWEIS: Sie können die Reihenfolge der verschiedenen Typen nicht steuern, oder wie oft jeder Typ auftritt (jeder kann einmal, oft oder gar nicht erscheinen) - genau wie bei eine Liste von polymorphen Klassen in Java oder C #. Aber Sie können zumindest die genaue Länge der Liste angeben (wenn Sie möchten).

Ich habe beispielsweise das obige Beispiel auf genau zwei Elemente beschränkt, aber die Reihenfolge ist nicht festgelegt (dh Hersteller könnte der erste sein oder Zutaten könnte der erste sein) ); und die Anzahl der Wiederholungen ist nicht festgelegt (d. h. sie können beide Hersteller oder beide Zutaten oder jeweils eins sein).

Sie können, mit XML Schema type , wie in:

%Vor%

Und das XSD definiert separate komplexe Typen für jedes:

%Vor%

Dies ist ein Sonderfall für xsi:type . Im Allgemeinen glauben Sie nicht, dass Sie Attribute angeben können, um unterschiedliche Werte in Elementen mit demselben Namen zu haben, da sie unterschiedliche Definitionen desselben Elements sind.

Ich bin nicht 100% klar über den genauen Grund - weiß jemand den relevanten Teil der Spezifikation?

    
13ren 05.05.2009 23:04
quelle
2

Sie könnten so etwas ausprobieren - erstellen Sie einen separaten complexType für Ihre "informationSet" -Elemente und beschränken Sie das Attribut auf eine Liste gültiger Strings:

%Vor%

Natürlich können Sie diese Liste mit gültigen Attributnamen erweitern, wenn Sie möchten - fügen Sie einfach weitere Elemente zur Restriktionsenumerationsliste hinzu.

Marc

    
marc_s 06.05.2009 05:14
quelle
1

Verwenden der Assertionsschema-Komponente

Dank XML Schema 1.1 können Sie Ihre Anforderung erzwingen, ohne den Namespace xsi und den Hack-Polymorphismus in Ihr XML-Dokument importieren zu müssen. XML Schema 1.1 brachte zwei neue Komponenten, Assertions und Typalternativen mit den Elementen xs:assert und xs:alternative . Sie haben ein @test -Attribut, in dem Bedingungen und Einschränkungen als XPath 2.0-Ausdrücke festgelegt werden.

Auch wenn xs:alternative offensichtlich die Lösung für Ihr Problem sein soll, ist es mir noch nicht gelungen, alternative Typen basierend auf der Position eines Elements zuzuweisen. ( Das Verständnis des Schema-Parsers von Knotenkontexten scheint sich von dem zu unterscheiden, was ich aufgrund der validierten XML-Dokumentstruktur erwarten würde. )

Anyway , können Sie Ihre Einschränkungen mit xs:assert :

erzwingen %Vor%

Die Verwendung des Attributs @xpathDefaultNamespace ist möglicherweise nicht erforderlich, wenn der Namespace Ihres Schemas null ist, aber muss auf ##targetNamespace gesetzt sein, wenn Ihr Schema eins definiert, andernfalls wird die Bewertung des Elementnamens fehlschlagen .

  

Hinweis: Damit dies funktioniert, ist es notwendig, einen Validator zu verwenden, der XML Schema 1.1 unterstützt. Wenn Sie beispielsweise OxygenXML verwenden, können Sie die Standard-XML-Schemaversion auf der XML-XML-XML-Parser- / XML-Schema-Vorgabeseite auf 1.1 setzen. Wenn Sie Xerces als Validator verwenden, muss eine zusätzliche Funktion aktiviert werden: http://apache.org/xml/features/validation/cta-full-xpath-checking . Anderenfalls wird es nicht möglich sein, die meisten XPaths auszuwerten, da Sie standardmäßig eine unzureichende Teilmenge verwenden.

J. Katzwinkel 22.09.2015 12:40
quelle
0

Vielleicht ist Ссылка genau das, wonach Sie suchen.

    
DarkFox 28.02.2011 07:38
quelle
0

In VS wird ein Fehler gemeldet: Elemente mit demselben Namen und demselben Bereich müssen denselben Typ aufweisen.
Ich denke, XSD kann Ihre Anforderung nicht erfüllen, Sie können versuchen, es aus einer anderen Richtung zu lösen. Verwenden Sie beispielsweise xslt, um XML zu validieren. XSLT ist xpath-basiert und regelbasiert, es kann jede Stelle in xml überprüfen.
XSD + XSLT ist eine gute Lösung, XSD für Schema-Check, XSLT für Informationsprüfung.

    
dasons 10.04.2015 10:10
quelle

Tags und Links