2009-08-07 3 views
0

Ist es möglich, XSD zu verwenden, um Knotennamen zur Aufzählung zurückzuverfolgen, und dann basierend auf dieser Aufzählung weitere Einschränkungen hinzuzufügen?XSD-Einschränkungen

Im Beispiel habe ich diese xml:

<a> 
    <b name="string" value="hello"> 
    <b name="integer" value="123"> 
</a> 

Ich will "b" Knoten haben Attribut name aus Aufzählung { "string", "integer"}. Dann, wenn es "Zeichenfolge" ist, möchte ich, dass "Wert" -Attribut zu Typ von xs: string, und wenn es "Integer" ist, möchte ich, dass "Value" -Attribut zu Typ von xs: Integer.

Antwort

1

Nein. Dies ist in XSD nicht möglich. Im Wesentlichen haben Sie 2 < b> s mit verschiedenen Typen. Dies verletzt die Element Consistency rule.

Sie haben ein paar Optionen,

  1. die Regeln außerhalb Schema Erzwingen, in Ihrer Anwendung. Das werde ich tun.
  2. Verwenden Sie eine Validierungssprache wie Schematron, wie von anderen erwähnt.
  3. Wechseln Sie zu einer leistungsfähigeren Schemasprache wie Relax NG.
+0

Genau wie ich dachte. Danke für deine Antwort. – ppiotrowicz

1

Sie können bestimmte Grenze, z. Sie können begrenzen, dass die Werte Ihres Attributs name aus einer gegebenen Liste kommen - aber Sie können diese Art von Beziehungen nicht zwischen "Wenn Name ist Zeichenfolge, dann muss der Typ des Werts xs: string sein" im XML-Schema ausdrücken.

Sie müssen entweder eine andere Technik verwenden (wie Schematron), oder überprüfen Sie dies in Ihrem App-Code.

Marc

+0

Danke für die Antwort. Ich werde näher auf Schematron schauen. – ppiotrowicz

0

Nein. Aber du bist wie ein Typname der Behandlung - und XML-Schema tut hat eine gewisse Unterstützung für die complexType ein Element durch einen String-Wert bestimmt wird. Allerdings müssen Sie die Attributnamen verwenden „xsi: type“ in Ihrem XML-Dokument, so würde es so aussehen:

<a> 
    <b xsi:type="string" value="hello"> 
    <b xsi:type="integer" value="123"> 
</a> 

Das ist das Beste, das XML-Schema tun, fürchte mich. Weitere Details in der offiziellen Grundierung (die leider ziemlich verwirrend sein kann): http://www.w3.org/TR/xmlschema-0/#UseDerivInInstDocs