2009-06-09 15 views
4

Ist es möglich, ein XML-Schema mit dem folgenden Verhalten zu erstellen? Ich habe eine XML-Datei, die wie folgt aussieht. Ich möchte Attribute von Object basierend auf dem Wert von Type entweder verfügbar machen oder einschränken. Zum Beispiel, wenn Type = "Bike", möchte ich möglicherweise Attribute nur für Bike (d. H. Pedale, Frame, etc) verfügbar machen. Wenn der Typ = "Auto", möchte ich möglicherweise Attribute, die nur für Auto relevant sind (d. H. Make, Model, Miles, etc.) verfügbar machen.Zulassen/Einschränken von XML-Attributen basierend auf anderen Attributen

<Objects> 
    <Object Type="Bike" Pedals="XXX" Frame="XXX" /> 
    <Object Type="Car" Make="XXX" Model="XXX" Miles="XXX" /> 
</Objects> 

Vielen Dank im Voraus für jede Hilfe. Lass es mich wissen, wenn du irgendwelche Fragen hast.

Antwort

4

Mein Verständnis ist, dass dies jenseits dessen ist, was Sie mit xsd tun können. Außerdem macht es die Abfrage eines Albtraums. Der bevorzugte Ansatz (wenn es möglich ist) zu verwenden:

<vehicles> 
    <bike pedals="XXX" frame="XXX" /> 
    <car make="XXX" model="XXX" miles="XXX" /> 
</vehicles> 

Wo car und bike vermutlich eine gemeinsame Wurzel haben vehicle im XSD, aber ihre eigenen spezifischen Eigenschaften (auf den geerbten).

+1

Ich bin mir nicht sicher, ob es technische Gründe gibt, warum das nicht möglich wäre - das ist absolut der richtige Ansatz und wurde sogar vom W3C speziell angesprochen, obwohl ich mich bemühe, das Dokument zu finden. – annakata

+0

von "wenn es möglich ist", meinte ich "für dein Szenario" ;-p –

2

Ich denke, Sie sind zu viele Dinge in Attribute zu stopfen. Dinge wie Pedale und Rahmen sollten wahrscheinlich Elemente sein.

+0

+1 genau so – annakata

+0

Alter Thread aber, warum? Sie sind einfache Werte warum sollten die Elemente statt Attribute sein? –

+0

@Josh - http://www.w3schools.com/DTD/dtd_el_vs_attr.asp <- Ich stimme diesen Punkten zu. – dss539

0

Ich stimme zu Marc, dass was Sie versuchen, ist außerhalb der Funktionen von W3C XML-Schema. Ich würde auch zustimmen, dass Ihr Datenmodell nur ein bisschen überladen/mehrdeutig ist, um nützlich zu sein. Wenn Sie jedoch keine Wahl haben, könnte vielleicht entweder Schematron oder Relax-NG eine praktikable Lösung bieten.

0

Ja, man muss nur xsi:type statt Type für XSD-Polymorphismus verwenden (und im Schema, leitet die Typen von einem gemeinsamen Typ):

<Objects> 
    <Object xsi:type="Bike" Pedals="XXX" Frame="XXX" /> 
    <Object xsi:type="Car" Make="XXX" Model="XXX" Miles="XXX" /> 
</Objects> 

Einzelheiten finden Sie in die XML Schema Part 0: Primer. Es hat eine example schema dafür, in der USAddress und UKAddress Typen von Adresse abgeleitet werden. Weiter unten ist ein example instance mit xsi:type.

Verwandte Themen