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


gesamter Thread:

 RSS-Feed dieser Diskussion