Hallo,
ich befasse mich gerade ein wenig mit XML. Bin jedoch noch nicht bei der eigentlichen Programmierung in JAVA sondern bei der Schemadefinition. Hier habe ich ein kleines Problem, wo ich nicht weiter komme. Möglicherweise sehe ich das mit dem Schema auch zu eng, sodass man das ganze besser programmtechnisch Lösen sollte als durch die XSD - in jedem Fall würde ich mich über ein paar Hinweise und Anregungen freuen, bevor ich mich da verrenne.
Konkret geht es um das Erstellen einer Schemadatei (XSD). Ich möchte erreichen, dass sich innerhalb eines Elements zwei Attribute gegenseitig ausschließen - also nicht den selben Wert zugewiesen bekommen. Ein einfaches Beispiel soll das mal beschreiben.
Zum Beschreiben einer Route gibt es Orte mit einer eindeutigen ID (key). Diese Schlüssel können innerhalb von from und to beim Element reiseweg eingetragen werden. Dies funktioniert soweit auch ganz gut, da ich hier mit key und keyref arbeiten kann. Meine bisherige XSD sieht somit wie folgt aus:
Was ich damit jedoch nicht erreiche ist, dass ich Einträge wie bspw.: <reiseweg from="2" to="2" />, bei denen from = to ist, unterbinde. Gibt es eine Möglichkeit, so etwas innerhalb des Schemas festzulegen?
Bisher eingefallen ist mir der theoretische Umweg über eine Transformation. Innerhalb der XSLT könnte ich letztlich abfragen, ob from != to ist und nur diese Elemente berücksichtigen. Das könnte also so aussehen:
Grundsätzlich wäre mir jedoch eine Lösung ohne XSLT lieber, da ich bei der Transformation aufpassen muss, dass nicht an anderer Stelle durch diese Reduktion invalides XML erzeugt wird.
Über ein paar Anregungen freue ich mich!
Gruß Micha
ich befasse mich gerade ein wenig mit XML. Bin jedoch noch nicht bei der eigentlichen Programmierung in JAVA sondern bei der Schemadefinition. Hier habe ich ein kleines Problem, wo ich nicht weiter komme. Möglicherweise sehe ich das mit dem Schema auch zu eng, sodass man das ganze besser programmtechnisch Lösen sollte als durch die XSD - in jedem Fall würde ich mich über ein paar Hinweise und Anregungen freuen, bevor ich mich da verrenne.
Konkret geht es um das Erstellen einer Schemadatei (XSD). Ich möchte erreichen, dass sich innerhalb eines Elements zwei Attribute gegenseitig ausschließen - also nicht den selben Wert zugewiesen bekommen. Ein einfaches Beispiel soll das mal beschreiben.
Code:
<orte>
<ort pid="1" name="Berlin" />
<ort pid="2" name="Hamburg" />
<ort pid="3" name="München" />
</orte>
<reise>
<reiseweg from="1" to="2" />
<reiseweg from="2" to="3" />
<reiseweg from="1" to="3" />
<reiseweg from="2" to="2" /> <!-- dieses soll unterbunden werden -->
</reise>
Zum Beschreiben einer Route gibt es Orte mit einer eindeutigen ID (key). Diese Schlüssel können innerhalb von from und to beim Element reiseweg eingetragen werden. Dies funktioniert soweit auch ganz gut, da ich hier mit key und keyref arbeiten kann. Meine bisherige XSD sieht somit wie folgt aus:
Code:
<xsd:key name="keyPid">
<xsd:selector xpath=".//ort"/>
<xsd:field xpath="@pid"/>
</xsd:key>
<xsd:keyref name="keyrefPidTo" refer="oa:keyPid">
<xsd:selector xpath=".//reiseweg"/>
<xsd:field xpath="@to"/>
</xsd:keyref>
<xsd:keyref name="keyrefPidFrom" refer="oa:keyPid">
<xsd:selector xpath=".//reiseweg"/>
<xsd:field xpath="@from"/>
</xsd:keyref>
Was ich damit jedoch nicht erreiche ist, dass ich Einträge wie bspw.: <reiseweg from="2" to="2" />, bei denen from = to ist, unterbinde. Gibt es eine Möglichkeit, so etwas innerhalb des Schemas festzulegen?
Bisher eingefallen ist mir der theoretische Umweg über eine Transformation. Innerhalb der XSLT könnte ich letztlich abfragen, ob from != to ist und nur diese Elemente berücksichtigen. Das könnte also so aussehen:
Code:
<xsl:template match="reiseweg">
<xsl:if test="./@from != ./@to">
<xsl:copy>
<xsl:apply-templates select="@*|*|text()" />
</xsl:copy>
</xsl:if>
</xsl:template>
Grundsätzlich wäre mir jedoch eine Lösung ohne XSLT lieber, da ich bei der Transformation aufpassen muss, dass nicht an anderer Stelle durch diese Reduktion invalides XML erzeugt wird.
Über ein paar Anregungen freue ich mich!
Gruß Micha