Thomas Müller: if-Anweisung und Variablen

Ich suche seit langem nach einer Lösung. Vielleicht kann mir hier ja jemand helfen.

Mit einer PHP-Funktion ersetzte ich in der XSLT-Datei "{@_GET_MTID@}" beispielsweise in "mt_0", damit ich eine Unternavigation auf meiner Seite erstellen kann. Diesen Wert speichere ich in der Variablen $_get_mtid.

Dieses funktioniert einwandfrei. Habe ich bereits getestet.
Wenn ich nun mit "xsl:if" überprüfen möchte, ob die Hauptnavigation (sprich: das Attribut @mtid vom Element <maintopic>) mit der Variablen $_get_mtid übereinstimmt, dann geht nichts mehr. Ersetzte ich aber in der if-Anweisung die Variable $_get_mtid per Hand durch 'mt_0' klappts.

Was mache ich falsch???

Gruß Thomas

XML-Datei:

<?xml version="1.0" encoding="ISO-8859-15"?>
<topics>
<maintopic mtid='mt_0' group='all'>
  <string>Home</string>
  <title>Zur Startseite</title>
  <target>_self</target>
  <url><![CDATA[./index.php?module=content&data=home]]></url>

<topic tid='t_0' group='all'>
   <string>Projekt "drago XCMS" [extern]</string>
   <title>Zur Homepage des "drago"-Projekts"</title>
   <target>_blank</target>
   <url><![CDATA[http://dragoxcms.dyns.net?]]></url>
  </topic>
</maintopic>
<maintopic mtid='mt_999' group='all'>
  <string>Logout</string>
  <title>*drago intraserv {@DRAGO_VERSION@}* abmelden</title>
  <target>_self</target>
  <url><![CDATA[./index.php?module=logout]]></url>

<topic tid='t_0' group='all'>
   <string>Test</string>
   <title>Zur Homepage des "drago"-Projekts"</title>
   <target>_blank</target>
   <url><![CDATA[http://www.test.de?]]></url>
  </topic>
</maintopic>
</topics>

XSLT-Datei:

<?xml version="1.0" encoding="ISO-8859-15"?>
<xsl:stylesheet xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>

<xsl:variable name="_get_mtid">{@_GET_MTID@}</xsl:variable>

<xsl:template match="maintopic">
  GET <xsl:value-of select="$_get_mtid"/> : M <xsl:value-of select="@mtid"/><br/>

<xsl:if test="@mtid=$_get_mtid">
   OK !
   <xsl:apply-templates select="topic"/>
  </xsl:if>
</xsl:template>

<xsl:template match="topic">
  xsl:text<![CDATA[!!! TOPIC !!!]]></xsl:text><br />
  <xsl:variable name="url"><xsl:value-of select="url"/>xsl:text<![CDATA[&mtid=]]></xsl:text><xsl:value-of select="$_get_mtid"/>xsl:text<![CDATA[&tid=]]></xsl:text><xsl:value-of select="@tid"/></xsl:variable>
  <xsl:variable name="target" select="target"/>
  <xsl:variable name="title" select="title"/>

<a href="{$url}" target="{$target}" title="{$title}"><xsl:value-of select="string"/></a>
  <br/>
</xsl:template>
</xsl:stylesheet>

  1. Hallo,

    Mit einer PHP-Funktion ersetzte ich in der XSLT-Datei "{@_GET_MTID@}" beispielsweise in "mt_0", damit ich eine Unternavigation auf meiner Seite erstellen kann. Diesen Wert speichere ich in der Variablen $_get_mtid.

    Dieses funktioniert einwandfrei. Habe ich bereits getestet.
    Wenn ich nun mit "xsl:if" überprüfen möchte, ob die Hauptnavigation (sprich: das Attribut @mtid vom Element <maintopic>) mit der Variablen $_get_mtid übereinstimmt, dann geht nichts mehr. Ersetzte ich aber in der if-Anweisung die Variable $_get_mtid per Hand durch 'mt_0' klappts.

    Was mache ich falsch???

    <xsl:variable name="_get_mtid">{@_GET_MTID@}</xsl:variable>

    Der Wert dieser Variable wird flgendes sein: "{mt_0}" d.h. es stimmt natürlich nie mit "mt_0" überein.
    <xsl:variable name="_get_mtid">@_GET_MTID@</xsl:variable>

    Es hilft bei solchen Fällen, wenn du versucht den Wert der Variable auszugeben, dann kannst du sehen ob und wlechen Wert die Variable hat.

    Grüße
    Thomas

    1. Hallo Thomas,

      Der Wert dieser Variable wird flgendes sein: "{mt_0}" d.h. es stimmt natürlich nie mit "mt_0" überein.
      <xsl:variable name="_get_mtid">@_GET_MTID@</xsl:variable>

      Es hilft bei solchen Fällen, wenn du versucht den Wert der Variable auszugeben, dann kannst du sehen ob und wlechen Wert die Variable hat.

      der Wert ist "mt_0" (ohne Anführungszeichen). Auch wenn ich in der Hauptnavigation einen anderen Punkt anklicke, wird der richtige Wert übergeben.

      Ich stehe jetzt echt auf dem Schlauch. Bin nämlich gerade dabei mir ein CMS mit PHP auf XML-Basis aufzubauen.

      Grüße Thomas

      1. Hallo,

        der Wert ist "mt_0" (ohne Anführungszeichen). Auch wenn ich in der Hauptnavigation einen anderen Punkt anklicke, wird der richtige Wert übergeben.

        Ich stehe jetzt echt auf dem Schlauch. Bin nämlich gerade dabei mir ein CMS mit PHP auf XML-Basis aufzubauen.

        also bis auf das:
        <xsl:stylesheet xsl:version="1.0"
                        ^^^^^^^^^^^^^^
        in deinem XSL (das sollte nur version="1.0" sein) sehe ich keinen Fehler mehr.
        Da ich dein Beispiel auch nur so Testen kann, dass ich den Wert der Variable hardcodiert ins XSL schreibe, kann ich nur noch Vermutungen anstellen.
        Wenn du sagst: "Mit einer PHP-Funktion ersetzte ich in der XSLT-Datei [...] Dieses funktioniert einwandfrei. Habe ich bereits getestet."

        D.h. die XSL-Datei wird geändert (ich frage trotzdem nach: hast du die geänderte XSL-Datei am Server geöffnet und nachgesehen welcher Wert tatsächlich in der Variable steht?) Dann wird die Transformation mit dieser Datei duchgeführt.

        Warum übergibts du eigentlich diesen Wert nicht als URL-Parameter und wertest ihn dann im XSL aus?

        Statt also <xsl:variable name="_get_mtid"> ... </xsl:variable>
        <xsl:param name="_get_mtid">
        der Rest bleibt gleich. PHP bietet doch dafür die Unterstützung:
        http://www.php.net/manual/de/ref.xsl.php

        Grüße
        Thomas

        --
        Surftip: kennen Sie schon Pipolino's Clowntheater?
        http://www.clowntheater-pipolino.net/
        1. Hi,

          Wenn du sagst: "Mit einer PHP-Funktion ersetzte ich in der XSLT-Datei [...]"

          Habe ganz vergessen zu erwähnen, dass ich die Datei mit implode() einlese und dann mit str_replace() ersetze.

          [...] (ich frage trotzdem nach: hast du die geänderte XSL-Datei am Server geöffnet und nachgesehen welcher Wert tatsächlich in der Variable steht?) Dann wird die Transformation mit dieser Datei duchgeführt.

          Wie öffne ich denn eine temporär geänderte Datei? Die Änderung ist doch nicht auf meinem lokalen Testserver ("XAMPP" mit PHP4 unter Linux) gespeichert. Wenn ich die Quelltext-Ansicht mit dem Konqueror öffne, dann sehe ich nur den dort eingesetzen Wert.

          Statt also <xsl:variable name="_get_mtid"> ... </xsl:variable>
          <xsl:param name="_get_mtid">

          Habe ich probiert, geht aber genauso wenig. Ausserdem habe ich kein Unterschied zwischen "xsl:param" und "xsl:variable" gefunden.

          Schönen Sonntag noch.
          Thomas

          1. Hallo,

            Wie öffne ich denn eine temporär geänderte Datei? Die Änderung ist doch nicht auf meinem lokalen Testserver ("XAMPP" mit PHP4 unter Linux) gespeichert.

            Das ist ein Fehler. Wenn du die Datei "on the fly" änderst und dann aus dem XML heraus mit dem <?xml-stylesheet type="text/xsl" href=""?> die Tranformation ausführen willst, wird dantürlich die Datei von der Festplatte geladen und nicht das was irgendwo im Memory herumkugelt.
            Du muss schon die Datei "richtig" speichern.

            Statt also <xsl:variable name="_get_mtid"> ... </xsl:variable>
            <xsl:param name="_get_mtid">

            Habe ich probiert, geht aber genauso wenig. Ausserdem habe ich kein Unterschied zwischen "xsl:param" und "xsl:variable" gefunden.

            Ich habe nicht gemeint, dass die Statt Variable, Parameter verwendest und dessen wert auf dieselbe Weise zu ersetzen versucht. Das bringt dir natürlich  so nichts.
            Der Unterschied ist, dass in XSL Werte von Variablen, so einmal definiert nicht mehr geändert werden können. Werte von Parameter dagegen ja.

            Fangen wir vielleicht von vorne an ;-)

            Wird die XML/XSL-Transformation am Server ausgeführt, oder überläßt du dem Browser mit <?xml-stylesheet type="text/xsl" href=""?> dies zu erledigen?

            Wenn am Server: du hast PHP 4, dann brauchst du dazu Sablotron http://www.php.net/manual/en/ref.xslt.php
            Dann kannst du statt der Variable Parameter einsetzen und den gewünschten Wert als URL-Parameter mitgeben.

            Wenn im Browser: In dem Fall nützt dir ein URL-Parameter nicht, d.h. du muss die geänderte Datei auf die Festplatte speichern.

            Grüße
            Thomas

            --
            Surftip: kennen Sie schon Pipolino's Clowntheater?
            http://www.clowntheater-pipolino.net/
            1. Hi Thomas,

              erstmal Klasse, welche Geduld du aufbringst. Bin jetzt Klappte alles Prima, bis auf dieses Problem.

              Wird die XML/XSL-Transformation am Server ausgeführt, oder überläßt du dem Browser mit <?xml-stylesheet type="text/xsl" href=""?> dies zu erledigen?

              Die Transformation erledigt der Server. Im XML-Code ist kein "<?xml-stylesheet" eingebunden. So habe ich übrigens auch die Hauptnavigation eingebunden. Funktioniert sehr gut. Da brauchte ich aber keine Prüfung, welcher Menüpunkt ausgewählt wurde. Hier der Code:

              function transform_xml($xml_file, $xslt_file)
              {  if (extension_loaded('xslt'))
                {  $transform = xslt_create();
                   if(!$return_code = xslt_process($transform, $xml_file, $xslt_file)) exit;
                   xslt_free($transform);
                } else { // Ausgabe der Fehlermeldung
                }

              if (isset($_GET['mtid']) || $_GET['mtid'] != '')
                {  $return_code = str_replace ('{@_GET_MTID@}', $_GET['mtid'], $return_code); }
                else
                { $return_code = str_replace ('{@_GET_MTID@}', 'mt_0', $return_code); }

              return $return_code; // Rückgabe des erstellten HTML_Codes
              }

              Wenn am Server: du hast PHP 4, dann brauchst du dazu Sablotron

              Sablotron 1.0 ist laut phpinfo() installiert.

              Gruß Thomas

              1. Hi,

                habe nun eine Lösung gefunden. Danke für den Tip.
                Ich gebe nun den Parameter "_get_mtid" der Funktion "xslt_process" mit. Nun funktionierts.

                Viele Dank und noch einen schönen Abend.
                Thomas

                1. Hallo Thomas,

                  habe nun eine Lösung gefunden. Danke für den Tip.
                  Ich gebe nun den Parameter "_get_mtid" der Funktion "xslt_process" mit. Nun funktionierts.

                  Das ist wohl das Wichtigste ;-)

                  Viele Grüße
                  Thomas

                  --
                  Surftip: kennen Sie schon Pipolino's Clowntheater?
                  http://www.clowntheater-pipolino.net/