Biks: Übergabeprameter in XSL ermitteln

Hallo,

ich möchte in einer XSL-Datei die aktuelle URL (aus der Browseradressleiste) nutzen, um mittels einer Abfrage die angegebenen Parameter zu ermitteln. Das Parsen erfolgt durch den Browser selbst.

Einige Lösungsansätze habe ich schon gefunden. Eine erste soll folgende sein, wobei "urlpara" die Parameter der URL sind:

  
<xsl:param name="urlpara" />  

Doch das funktioniert wohl wenn dann nur, wenn das Parsen auf dem Server vorgenommen wird.

Eine zweite, die mir am sympatischsten ist:

  
<xsl:variable name="urlpara">  
 <xsl:value-of select="substring-after(URL,'=')"/>  
</xsl:variable>  

Leider funktioniert das auch nicht, egal ob ich URL, $URL oder @URL einsetze. Ich nehme an, "URL" muss erst beschrieben werden.

Aber wie? Mittels Javascript? Ist das wirklich nötig? Falls ja, wie kann ich die in Javascript erzeugte Variable dem XSL-Code zuführen?

Über den einen oder anderen Tipp würde ich mich sehr freuen!

Viele Grüße!
Biks

  1. Hallo,

    ich möchte in einer XSL-Datei die aktuelle URL (aus der Browseradressleiste) nutzen, um mittels einer Abfrage die angegebenen Parameter zu ermitteln. Das Parsen erfolgt durch den Browser selbst.

    Keine allzu gute Idee.

    Einige Lösungsansätze habe ich schon gefunden. Eine erste soll folgende sein, wobei "urlpara" die Parameter der URL sind:

    <xsl:param name="urlpara" />

    
    > Doch das funktioniert wohl wenn dann nur, wenn das Parsen auf dem Server vorgenommen wird.  
    >   
      
    korrekt (mehr oder weniger).  
      
    
    > Eine zweite, die mir am sympatischsten ist:  
    > ~~~xml
      
    
    > <xsl:variable name="urlpara">  
    >  <xsl:value-of select="substring-after(URL,'=')"/>  
    > </xsl:variable>  
    > 
    
    

    Leider funktioniert das auch nicht, egal ob ich URL, $URL oder @URL einsetze. Ich nehme an, "URL" muss erst beschrieben werden.

    Muss nicht beschreiben werden, wenn nur "URL" bedeutet <URL> sprich ein Element. @URL wäre ein Attribut und $URL eine Variable oder Parameter (die müsste man vorher definieren)

    Aber wie? Mittels Javascript?

    Ja.

    Ist das wirklich nötig?

    Nein, transformiere das XML am Server.

    Falls ja, wie kann ich die in Javascript erzeugte Variable dem XSL-Code zuführen?

    ein Beispiel findest du unter:
    http://forum.de.selfhtml.org/archiv/2006/3/t126420/#m815491 oder
    http://forum.de.selfhtml.org/archiv/2007/1/t144951/#m940434

    Grüße
    Thomas

    1. Hallo Thomas,

      ich fasse mal zusammen: Wenn ich browser-seitig parsen will/muss, kann ich nicht über XSL die aktuell verwendete URL ermitteln. Schade. Dann eben mittels JavaScript.

      Vielen Dank für deine Antwort und deine Links!

      Falls jemand spontan ein entsprechendes Script bei der Hand hat, kann er dies gerne an dieser Stelle posten ;o)

      Viele Grüße!

      Biks

      PS zum Thema parsen mittels Server: Mir ist bewusst, dass dies die schönere Lösung wäre. Aber aus technischen Gründen ist es nicht möglich, die verwendendeten Rechner miteinander zu vernetzen bzw. wäre der Aufwand für diesen einen Anwendungsfall einfach zu groß. Ebenso auf jedem Rechner einen Server zu installieren.

    2. Die von Thomas genannten Beispiele sind wirklich gut und dienten mir als Vorlage:

      Falls ja, wie kann ich die in Javascript erzeugte Variable dem XSL-Code zuführen?

      ein Beispiel findest du unter:
      http://forum.de.selfhtml.org/archiv/2006/3/t126420/#m815491 oder
      http://forum.de.selfhtml.org/archiv/2007/1/t144951/#m940434

      Grüße
      Thomas

      Ich konnte das nun auch nach meinen Wünschen umsetzen - zumindestens fast. Hier meine Lösung, vielleicht hilft es ja jemanden weiter. Unterm Strich ist es der Code von Thomas, nur mit einer Parameterübergabe der URL-Adresse an die XSL-Daten. --> Danach habe ich noch zwei weitere Fragen <--

      ------------------XML-Daten------------------

      <?xml version='1.0'?>  
      <pwdb>  
       <station name="ort1" verband="region1">  
        <tag>gross</tag>  
       </station>  
       <station name="ort2" verband="region1">  
        <tag>gross</tag>  
       </station>  
       <station name="ort3" verband="region1">  
        <tag>gross</tag>  
       </station>  
       <station name="ort4" verband="region2">  
        <tag>klein</tag>  
        <tag>gross</tag>  
       </station>  
       <station name="ort5" verband="region2">  
        <tag>klein</tag>  
       </station>  
       <station name="ort6" verband="region2">  
       </station>  
       <station name="ort7" verband="region3">  
        <tag>klein</tag>  
       </station>  
       <station name="ort8" verband="region3">  
       </station>  
      </pwdb>
      

      ------------------XSL-Daten------------------

      <?xml version="1.0" encoding="iso-8859-1"?>  
      <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
        
      <xsl:param name="eigeneAdresse"/>  
        
      <xsl:template match="/">  
       <xsl:apply-templates select="pwdb"/>  
      </xsl:template>  
        
      <xsl:template match="pwdb">  
       <xsl:variable name="ort" select="substring-after($eigeneAdresse,'name=')"/>  
        
       <xsl:for-each select="station[@name=substring-after($eigeneAdresse,'name=')]">  
        <div>  
         Name: <xsl:value-of select="@name"/><br />  
         Verband: <xsl:value-of select="@verband"/><br />  
         Merkmal: <xsl:apply-templates select="tag"/>  
        </div>  
       </xsl:for-each>  
       <br />  
      </xsl:template>  
        
      <xsl:template match="tag">  
       <xsl:if test="position() &gt; 1">  
            <xsl:text>, </xsl:text>  
       </xsl:if>  
       <xsl:apply-templates/>  
      </xsl:template>  
        
      </xsl:stylesheet>  
      
      

      ------------------HTML-Daten------------------

      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
      <html>  
       <head>  
        <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">  
        <title>Pumpenstation</title>  
        
      [code lang=javascript]<script language="JavaScript" type="text/javascript">  
         var XMLDatei = "pumpenwerke.xml"; // Pafad zur XML-Datei  
         var XSLDatei = "pumpenstation.xsl"; // Pafad zur XSL-Datei  
         var objectXML;  
         var objectXSL;  
         var objectXSLCache;  
         var objectXSLTProcessor;  
         var HTMLAusgabe;  
        
         function transformation() {  
          // Abfrage für den Internet Explorer  
          if (window.ActiveXObject) {  
           // XML laden  
           objectXML = new ActiveXObject("MSXML2.DOMDocument");  
           objectXML.async = false;  
           objectXML.load(XMLDatei);  
        
           // XSL laden  
           objectXSL = new ActiveXObject("MSXML2.FreeThreadedDOMDocument.4.0");  
           objectXSL.async = false;  
           objectXSL.load(XSLDatei);  
           //cachen das XSLT für bessere performance  
           objectXSLCache = new ActiveXObject("Msxml2.XSLTemplate.4.0");  
              objectXSLCache.stylesheet = objectXSL;  
          }  
          // Abfrage für Mozilla / Netscape  
          else if (window.ChromeWindow) {  
           // Im Mozilla erst XSL laden  
           objectXSLTProcessor = new XSLTProcessor();  
           objectXSL = new XMLHttpRequest();  
           objectXSL.open("GET", XSLDatei, false);  
           objectXSL.send(null);  
           objectXSL = objectXSL.responseXML;  
           objectXSLTProcessor.importStylesheet(objectXSL);  
        
           // XML laden  
           objectXML = new XMLHttpRequest();  
           objectXML.open("GET", XMLDatei, false);  
           objectXML.send(null);  
           objectXML = objectXML.responseXML;  
          }  
          else {  
           alert("Ihr Browser unterstützt leider keine XML-XSL-Transformation mittels JavaScript");  
          }  
          refreshresults(); //führt die 1. tranformation aus mit dem wert aus dem ui.formular  
        
         }  
        
         function refreshresults() {  
           if (window.ActiveXObject) {  
           objectXSLTProcessor = objectXSLCache.createProcessor();  
                objectXSLTProcessor.input = objectXML;  
                 objectXSLTProcessor.addParameter("eigeneAdresse", document.URL, "");  
           objectXSLTProcessor.transform();  
           document.getElementById("results").innerHTML = objectXSLTProcessor.output;  
          }  
          else if (window.ChromeWindow) {  
           var myParam = objectXSLTProcessor.getParameter(null, "eigeneAdresse");  
           objectXSLTProcessor.setParameter(null, "eigeneAdresse", document.URL);  
           HTMLAusgabe = objectXSLTProcessor.transformToFragment(objectXML, document);  
           document.getElementById("results").innerHTML = "";  
           document.getElementById("results").appendChild(HTMLAusgabe);  
          }  
         }  
        
      </script>
      

      <style type="text/css">
         html, body {
          height:100%;
          margin:0px;
          padding:0px;
         }
        body { background-color:#909090; }
      </style>

      </head>

      <body onload="transformation();" id="results">

      </body>
      </html>
      [/code]

      Das funktioniert unter Firefox 3.0 sehr gut, aber leider nicht beim IE 8 beta:
      "Die Datei '.....?name=ort2' wurde nicht gefunden. Überprüfen Sie die Schreibweise und wiederholen Sie den Vorgang."
      Ist das ein generelles IE-Problem oder nur von der 8-Beta? (Konnte das selbst noch nicht austesten, vielleicht hat einer eine Idee dazu)

      Auch die Bildergalerie von Thomas nahm ich als Vorlage (http://forum.de.selfhtml.org/archiv/2006/3/t126420/#m815491). Nur möchte ich anstatt eines Bildes, oben genannte HTML-Seite in dem rechten großen Bereich öffnen. Dazu müsste ich die showmed-Funktion anzupassen. Einer meiner Versuche ist folgender:

        
         function showmed(title) {  
          var staturl = "pumpenstation.html?name=" + title;  
          var myHREF = document.createElement("a");  
          var Ausgabebereich = document.getElementById("med");  
          myHREF.appendChild(staturl);  
          Ausgabebereich.appendChild(myHREF);  
         }  
      
      

      Aber das haut nicht hin.
      Ist es möglich, innerhalb eines div-Bereiches eine HTML-Datei aufzurufen? Wie würde der Code entweder richtig für div bzw. wie mit iframe aussehen?

      Viele Grüße und vielen Dank nochmal an Thomas!

      Biks

      1. So, zumindestens im IE kann ich eine HTML-Seite in einem div-Bereich öffnen. Allerdings nur eine richtige Internetadresse und nicht meine gewünschte lokale Datei. Und außerdem erhalte ich eine Fehlermeldung ("Zugriff verweigert"), wenn ich ein weiteres mal den Link betätige :o(

        ----------------Javascipt-Daten----------------

          function showmed(title) {  
            var staturl = "pumpenstation.html?name=" + title;  
            document.getElementById("schwarz").object.location.href = "http://de.selfhtml.org";  
           }
        

        ----------------HTML-Daten----------------

          <div id="weiss">  
            <object id="schwarz" data="pumpenstation.html" type="text/html">  
            Ihr Browser kann das Objekt leider nicht anzeigen!  
          </object>  
        </div>
        

        Ist zwar der XSL-Themenbereich, aber kann mir trotzdem jemand weiterhelfen?

        Schönes Wochenende schonmal vorab!

        Biks

        1. Hallo,

          So, zumindestens im IE kann ich eine HTML-Seite in einem div-Bereich öffnen.

          Würde ich nicht versuchen, wenn es Cross-Browser-Lösung sein soll.
          Dann schon mal lieber ein <iframe>.

          Zu deiner anderen Frage wegen IE8 Beta: keine Ahnung. Ich habe damit noch nichts getestet. Mache erst wenn er wirklich draussen ist.

          Grüße
          Thomas

          PS: lieder muss ich weg, so das ich nicht ausführlicher antworten kann, aber zumindest ein kleines Feedback wollte ich geben.