Stringvergleiche in xsl:if
Jan
- xsl
Hi
Ich möchte in meiner XSL Transformation prüfen, ob ein Knotenwert einen bestimmten Wert hat. Aber der Vergleich funktioniert nicht mit Strings.
<xsl:if test="roomID=3">klappt</xsl:if>
Das funktioniert. Aber
<xsl:if test="status='bewilligt'">klappt</xsl:if>
klappt nicht. Ich habe verschiedene Knoten ausprobiert, die Stringvergleiche klappen nie, die Integervergleiche klappen alle.
Ich nutzen XSLT 1.0.
Irgendwelche Ideen?
Grüße
Jan
Hallo Jan,
<xsl:if test="status='bewilligt'">klappt</xsl:if>
klappt nicht. Ich habe verschiedene Knoten ausprobiert, die Stringvergleiche klappen nie, die Integervergleiche klappen alle.
Ich sehe hier kein Problem beim Zugriff auf den Kontextknoten von status:
<?xml version="1.0" encoding="UTF-8"?>
<status>bewilligt</status>
ergibt mit
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:if test="status='bewilligt'">klappt</xsl:if>
</xsl:template>
</xsl:stylesheet>
klappt
Das konkrete Problem hängt wohl von der nicht gezeigten XML-Struktur und dem Zugriff darauf ab. Die Prüfung lässt sich auch so formulieren: test="string(status/text())='bewilligt'" …
Grüße,
Thomas
Hi Thomas,
vielen Dank für deine Antwort. Folgender Code funktioniert leider auch nicht:
<xsl:if test="string(status/text())='bewilligt'">klappt</xsl:if>
Wenn ich direkt nach der if-Abfrage folgende Zeile eintrage
<xsl:value-of select="status" />
dann zeigt der mir richtiger Weise 'bewilligt' an. Und wie gesagt: Wenn ich einen anderen Knoten (nicht status) auswähle und darin eine Zahl gespeichert ist, dann geht der Vergleich. Ich poste mal die ganze Transformation und die XML-Datei. Die Transformation habe ich etwas gekürzt, damit es lesbarer wird, aber auch genau so getestet. Den Status nach der if-Anweisung lasse ich nur zum testen ausgeben. Damit sehe ich ja, dass ich den Knoten an sich richtig adressiere.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<xsl:for-each select="fullJoin/row">
<tr>
<td/>
<td/>
<td>
--<xsl:if test="status='bewilligt'">klappt</xsl:if>--
<xsl:value-of select="status" />
</td>
<td><xsl:value-of select="info" /></td>
</tr>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Die XML-Datei:
<fullJoin>
<row>
<userID>s-123</userID>
<lockAuthID>26</lockAuthID>
<roomID>3</roomID>
<status>bewilligt</status>
<info />
<roomNumber>C035</roomNumber>
<roomName>Büro 1</roomName>
</row>
<row>
<userID>s-456</userID>
<lockAuthID>27</lockAuthID>
<roomID>10</roomID>
<status>auslaufend</status>
<roomNumber>X123</roomNumber>
<roomName>Testraum</roomName>
</row>
</fullJoin>
Ich bin echt total ratlos.
Grüße
Jan
Hallo Jan,
Ich bin echt total ratlos.
Ich erhalte die Ausgabe (AltovaXML, MSXML, Saxon):
<tr><td /><td /><td>klapptbewilligt</td><td></td></tr><tr><td /><td /><td>auslaufend</td><td></td></tr>
Welchen exotischen XSLT-Prozessor verwendest Du?
Grüße,
Thomas
Ich schreibe gerade an meiner Abschlussarbeit. Dabei entwickel ich eine Komponente zur Erweiterung eines (von der Hochschule) selbstentwickelten Workflowsystems. Darin ist auch der XML-Prozessor enthalten. Ich werde dann mal das Entwicklungsteam belästigen müssen...
Ich danke dir für deine Hilfe!
Viele Grüße
Jan