Micha: 2 Attribute in einem Element via keyref, die nicht gleich sind

Hallo,

ich möchte in einer XSD einem Element zwei Attribute geben, die nur mit definierten Inhalten (key/keyref) belegt werden dürfen. Das habe ich soweit auch hinbekommen. Wie kann ich aber ausschließen, dass diese beiden Attribute den selben Schlüssel bekommen innerhalb eines Elementes?

Beispiel: Nehmen wir einen Wanderkarte mit verschiedenen (eindeutigen) Orten. Die Wegbeschreibung enthält immer ein from und ein to Attribut. Ausschließen möchte ich somit, das innerhalb eines Elements from und to ident sind.

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

Mein Ansatz in der XSD bisher lautet:

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

Mit dieser XSD erreiche ich aber lediglich, dass ich Reisewege zu undefinierten Orten ausschließe: <reiseweg from="4711" to="0815" /> aber identische Start- und Endorte nicht. Die beiden Attribute from und to müssten innerhalb von reiseweg irgendwie unique sein. Wie kann ich das erreichen oder geht das gar nicht?

Mit freundlichem Gruß
Micha

  1. Hallo,

    über eine XSLT könnte ich indirekt mein Ziel erreichen, indem ich beim Umwandeln die beiden Attribute prüfe und nur, wenn diese unterschiedlich sind, das Element kopiere. Konkret sieht das also wie folgt aus:

    <xsl:template match="reiseweg">  
      <xsl:if test="./@from != ./@to">  
        <xsl:copy>  
          <xsl:apply-templates select="@*|*|text()" />  
        </xsl:copy>  
      </xsl:if>  
    </xsl:template>
    

    Wenns schönere Lösung (ohne XSLT) gibt, freue ich mich, über einen entsprechenden Hinweis.

    Mit freundlichem Gruß
    Micha

  2. Hallo,

    ich hoffe, meine Problembeschreibung war verständlich. Ich liefere auch gern noch weitere Details - sofern nötig. Sollte man das beschriebene Problem besser (nur) Software-seitig und nicht (schon) in der XSD lösen, würde mir das auch schon weiterhelfen. So wüsste ich, dass ich mich da verrannt habe.

    Schönen Sonntag
    Micha