2 Attribute in einem Element via keyref, die nicht gleich sind
Micha
- xml
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
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
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