Avatar

XML/XSD Sich gegenseitig ausschließende Attribute definieren (Informationstechnik)

MichaeL ⌂, Bad Vilbel, Montag, 21. Februar 2011, 19:20 (vor 2524 Tagen)

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

--
freie Tools zur Netzausgleichung, Transformation und Formanalyse

Tags:
XML, XSD, XSLT, Schema, Attribute, Elemente

Avatar

XML/XSD Sich gegenseitig ausschließende Attribute definieren

GeoMark @, Mittwoch, 24. August 2011, 18:11 (vor 2340 Tagen) @ MichaeL

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 ;)

Avatar

XML/XSD Sich gegenseitig ausschließende Attribute definieren

MichaeL ⌂, Bad Vilbel, Mittwoch, 24. August 2011, 18:26 (vor 2340 Tagen) @ GeoMark

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

--
freie Tools zur Netzausgleichung, Transformation und Formanalyse

RSS-Feed dieser Diskussion