XML/XSD Sich gegenseitig ausschließende Attribute definieren (Informationstechnik)
Hallo,
ich befasse mich gerade ein wenig mit XML. So langsam aber sicher scheint das ja auch für den gemeinen Vermesser mal nötig zu werden.
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.
<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:
<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:
<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
--
applied-geodesy.org - OpenSource Least-Squares Adjustment Software for Geodetic Sciences
XML/XSD Sich gegenseitig ausschließende Attribute definieren
Du bist offensichtlich sehr mit OpenSource beschäftigt .. Die Transformationen brauchst Du ja nur bei Darstellung im Web
Ich habe sehr gute Erfahrung gemacht mit dem XML-Parser von http://www.nsoftware.com für Closed Source-Geschichten
XML/XSD Sich gegenseitig ausschließende Attribute definieren
Hallo,
Die Transformationen brauchst Du ja nur bei Darstellung im Web
Wie kommst Du darauf? Das ist mMn. nicht korrekt bzw. nur ein beschränkter Einsatzbereich. Eine Transformations ist auch nötig, um vom XML zu XML zu konvertieren (mit unterschiedlichen Schemadateien) oder um von XML zu ASCII zu kommen.
Ich habe sehr gute Erfahrung gemacht mit dem XML-Parser ...
Ich benötige keinen Parser (im Moment) sondern habe ein Problem bei der Definition des Schemas für meine Daten. Erst wenn das Schema stimmig ist, werde ich mich an einen Parser versuchen. Java bietet ja JDOM und JAXB an. Die Werkzeuge sind sind also nicht das Problem...
Micha
--
applied-geodesy.org - OpenSource Least-Squares Adjustment Software for Geodetic Sciences