2016-05-11 11 views
2

Ich erstelle ein Schema in XSD 1.1 für Kreuzworträtsel. Eines meiner Elemente ist <dimensions>. Beispiel:Einschränken von XML-Elementwerten basierend auf anderen Werten in XSD

<xs:element name="dimensions"> 
    <xs:simpleType> 
     <xs:restriction base="xs:string"> 
     <xs:pattern value="\d+x\d+"/> 
     </xs:restriction> 
    </xs:simpleType> 
</xs:element> 

Das resultierende XML würde so aussehen <dimensions>21x21</dimensions>, was bedeutet, dass das Puzzle Gitter 21 Quadrate von 21 Plätzen.

Ich habe auch ein <cell> Element für jedes Quadrat im Puzzle. Also für ein Puzzle mit den Abmessungen 21x21 hätte ich 441 Instanzen von <cell>. Jede <cell> hat eine <coordinates> Element beschreibt seine Position in dem Netz:

<xs:element name="cell"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="coordinates"> 
       <xs:simpleType> 
        <xs:restriction base="xs:string"> 
         <xs:pattern value="\d+,\d+"/> 
        </xs:restriction> 
       </xs:simpleType> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

So ist die Position des Platzes in der unteren linken Ecke des Gitters würde durch <coordinates>21,1</coordinates> dargestellt werden, was darauf hinweist, dass es in der 21. Zeile ist, 1. Spalte.

Ich möchte folgendes tun:

  1. verlangen, dass es ein <cell> für jeden Platz ist, auf der Grundlage der <dimensions>. Zum Beispiel, wenn die Dimensionen 21x21 sind, müssen 441 Instanzen von <cell> - nicht mehr, nicht weniger.

  2. Erfordern, dass die <coordinates> für jede <cell> sind einzigartig und fallen in den Parametern der <dimensions. Mit anderen Worten, für ein 21x21-Gitter muss jede Achse der Koordinaten durch eine Zahl zwischen 1 und 21 dargestellt werden, und jede der 441 Kombinationen kann nur einmal verwendet werden.

Antwort

1

Sie benötigen XSD 1.1; Verwenden Sie eine Behauptung. Oder Sie müssen Ihr Schema parametrisieren (und wahrscheinlich Ihr XML ein wenig reorganisieren), um die Einschränkung auf andere Weise zu erzwingen (z. B. indem das Schema genau 21 Zeilen mit jeweils genau 21 Zellen benötigt).

+0

I XSD bin mit 1.1, aber ich kann das Schema nicht so parametrieren, dass es genau 21 Zeilen/Zellen benötigt, weil es Puzzles mit unterschiedlich großen Rastern (zB 15x15) aufnehmen muss. Wie also würde ich eine Aussage schreiben, die die Parameter von den Dimensionen abhängig machen kann? – Misenus

+0

Wenn Sie für alle Rätsel genau das gleiche Schema verwenden MÜSSEN, dann wird das Parametrieren natürlich nicht funktionieren. Aber es ist ein Grund sie zu parametrisieren, um Puzzles verschiedener Größe unterzubringen, kein Grund, warum du das nicht tun kannst. Wie können Sie Behauptungen anwenden? Was haben Sie bisher versucht? –

+0

Ich denke, ich könnte eine Reihe von Schemata für gebräuchliche Rastertypen und Dimensionen erstellen, aber das ist wahrscheinlich außerhalb des Umfangs dieses Projekts, das für die Schule ist; Ich versuche, ein TEI-abgeleitetes (TEI-inspiriertes?) Schema für die Codierung unkonventioneller Texte mit viel Struktur, wie Worträtsel, zu erstellen. Ich verstehe kaum Behauptungen (ich habe gerade gelernt, was sie gestern sind, als ich diese verwandte Frage gepostet habe: http://stackoverflow.com/questions/37127791/control-element-cardinality-based-on-an- attribute- enumeration-in-xsd), also habe ich noch keinen versucht. – Misenus

1

Ja, Assertions verwendet werden könnte, aber eine XML-Designänderung besser ...

Die Informationen würden Sie in dimensions wird angedeutet durch die Struktur Ihrer cell Elemente und automatisch werden können abgeleitet platzieren würde anstatt willkürlich festgelegt werden und dann unabhängig voneinander validiert werden müssen.

Ein ähnliches Argument gilt für coordinates.

(Beachten Sie auch, dass selbst wenn Sie Koordinaten darstellen ausdrücklich wollte, würde es besser sein, einzelne Elemente zu verwenden, oder besser noch, Attribute für jede Koordinate.)

+0

Aus verschiedenen Gründen, einschließlich der Durchsetzung der korrekten Dateneingabe, möchte ich "Koordinaten" explizit darstellen. Wenn ich also ein Koordinatenattribut für jede "Zelle" oder zwei Attribute (eines für jede Achse) erstelle, muss ich noch eine Assertion verwenden? Oder gibt es einen anderen Weg? – Misenus

+0

Die Validierung der Dateneingabe wird besser durchgeführt, bevor Daten auf XML zugreifen, und separate Attribute berücksichtigen offensichtlich nicht Ihre Validierungsanforderungen. Beachten Sie, dass ich Ihnen bereits ein Beispiel für die Verwendung von XSD 1.1-Assertionen gezeigt habe (http://stackoverflow.com/a/37129215/290085). Ich werde das hier nicht noch einmal tun, und, offen gesagt, (1) Sie brauchen keine Behauptungen hier, wenn Sie Ihren Entwurf reparieren, und (2) wenn Sie darauf bestehen, dass Sie sie wollen, sollten Sie selbst einen Stich auf sie machen nachdem bereits gezeigt wurde, wie man sie benutzt. – kjhughes

+0

Ich verstehe, dass Ihr Kommentar zur Validierung der Dateneingabe besser durchgeführt wird, bevor Daten auf XML treffen. Genau darum ging es mir, als ich nach einer Möglichkeit fragte, die Anzahl der "Zellen" und die Werte der "Koordinaten" zu kontrollieren, um sie den Händen der Person zu entziehen, die das XML erstellt hat. Ich frage also nicht nach einer Behauptung, ich verstehe einfach nicht, ob es möglich ist, mein Design so zu "reparieren", dass die Koordinaten explizit sind, ohne eine Behauptung zu verwenden, und wenn ja, was das zur Folge hätte. – Misenus

Verwandte Themen