Jan: Stringvergleiche in xsl:if

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

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

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

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

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