Robert: Javascript in XML

Hallo zusammen,

ich habe 2 Dateien die den unteren Quelltext enthalten.
Dabei dient die Daten.xml zum speichern aller notwendigen Daten nach der vorgegebenen Struktur.
In der auslesen.html befindet sich das Layout ( was noch karg ist weil erst die Funktionalität gewährleistet werden soll), und eine Suchabfrage. Diese Suchabfrage funktioniert über Javascript. Nun soll der dort eingegebene Wert in eine XSL-Variable ( siehe unten) gespeichert werden. Diese wird weitergegben und wenn ein Element gefunden wird in der Daten.xml dann wird dieses, oder diese ausgegeben.
DAs Problem ist, dass der Javascriptteil innerhalb des xsl Teils nicht verarbeitet wird?!

<xsl:variable name="Fehlernummer">
<SCRIPT language="JavaScript">
document.write(eingabe1);
</SCRIPT>
</xsl:variable>

Habe schon comment, text CDATA probiert, und funktioniert nicht.
WEnn ich die Suchabfrage rausnehme und den Suchwert statisch einsetze anstatt einer VAriablen funktioniert das wunderbar, nur es soll eben nach einem frei wählbaren Wert gesucht werden können.
Wie bekomme ich also das js-script in diese xsl Variable eingebettet?

Code:

auslesen.html:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="fehlermeldung">

<html>
<body>

<script type="text/javascript">

eingabe1 = prompt( "Fehlernummer");

</script>

<xsl:variable name="Fehlernummer">

<SCRIPT language="JavaScript">
xsl:comment
document.write(eingabe1);
</xsl:comment>
</SCRIPT>

</xsl:variable>

<table width="500">
<xsl:if test="contains(ueberschrift,$Fehlernummer)">
<tr>  <xsl:value-of select="ueberschrift" /></tr>
<tr>  <xsl:value-of select="beschreibung" /></tr>
<tr>  <xsl:value-of select="abhilfe" /></tr>
<tr>  <xsl:value-of select="hinweis" /></tr>
</xsl:if>
</table>
</body>
</html>

</xsl:template>

</xsl:stylesheet>

Daten.xml:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="auslesen.html" ?>
<dokument>
<test>
<fehlermeldung><ueberschrift>Fehlermeldung 12345</ueberschrift>
<beschreibung>BESCHREIBUNG 12345</beschreibung>
<abhilfe>ABHILFE 12345</abhilfe>
<hinweis>HINWEIS 12345</hinweis>
</fehlermeldung>

<fehlermeldung><ueberschrift>die Nummer der Fehlermeldung lautet 12300</ueberschrift>
<beschreibung>die beschreibung der fehlermeldung</beschreibung>
<abhilfe>beschreibung der abhilfe</abhilfe>
<hinweis>ein allgemeiner </hinweis>
</fehlermeldung>

<fehlermeldung><ueberschrift>die Nummer der Fehlermeldung lautet 12840</ueberschrift>
<beschreibung>die beschreibung der fehlermeldung</beschreibung>
<abhilfe>beschreibung der abhilfe</abhilfe>
<hinweis>ein allgemeiner </hinweis>
</fehlermeldung>
</test>
</dokument>

ich probier da jetzt schon ewig dran rum und es klappt einfach nicht, wäre echt super wenn ihr mir helfen könntet

  1. Hallo,

    Diese Suchabfrage funktioniert über Javascript. Nun soll der dort eingegebene Wert in eine XSL-Variable ( siehe unten) gespeichert werden. Diese wird weitergegben und wenn ein Element gefunden wird in der Daten.xml dann wird dieses, oder diese ausgegeben.

    Da hast du etwas grundsätzlich missverstanden.

    Du kannst meines Wissens nicht mit JavaScript eine Benutzerinteraktion durchführen und das Ergebnis direkt im XSLT-Stylesheet verwenden. Die Verarbeitung läuft so ab, dass es überhaupt nicht möglich ist, mit JavaScript etwas ins Dokument zu »schreiben«, sodass dann damit eine XSL-Variable gesetzt wird.
    Man kann nicht JavaScript in ein XSLT-Stylesheet einbinden, sodass JavaScript und XSLT gleichzeitig ausgeführt werden und quasi der XSLT-Prozessor auf die Ausführung des JavaScripts »wartet«. Das sind völlig verschiedene Ebenen, die zu unterschiedlichen Zeiten ausgewertet werden.

    Mal Schritt für Schritt:

    Der Browser oder sonst ein Parser lädt und parst das XML-Dokument und findet den Verweis auf das Stylesheet. Auch dies lädt und parst er. Dann startet er die Transformation. Auf dieser Ebene sieht er bloß zwei XML-Dokumente und erzeugt mithilfe des Stylesheets ein Ergebnisdokument.

    Bis das geschehen ist, wird kein JavaScript ausgeführt, es kann keine Interaktion stattfinden. Wenn du folgendes schreibst:

    <xsl:variable name="Fehlernummer">  
    <script type="text/javascript">  
    <xsl:comment>  
    document.write(eingabe1);  
    </xsl:comment>  
    </script>  
    </xsl:variable>
    

    Dann ist die Variable IMMER leer! Wenn der XSLT-Parser arbeitet, wird kein JavaScript ausgeführt oder sonst irgendetwas getan. Der Parser beachtet ganz allein den Code im Stylesheet und in der Ausgangs-XML-Datei.

    Es wird also erst der Ergebnisbaum erzeugt. Dabei kommt ganz normaler, statischer HTML-Code heraus. Nicht mehr und nicht weniger macht der XSLT-Prozessor, dann schaltet er sich ab. WAS er da zusammenbaut mithilfe der XML-Dokumente, ist ihm egal.

    Anschließend verarbeitet der Browser das HTML-Dokument, um es darzustellen. JETZT wird auch das JavaScript berücksichtigt, soweit es denn im HTML-Code liegt.

    Und so sieht der Code aus:

      
    <html><body>  
    <script type="text/javascript">  
    eingabe1 = prompt( "Fehlernummer");  
    </script><table width="500">  
    <tr>Fehlermeldung 12345</tr>  
    <tr>BESCHREIBUNG 12345</tr>  
    <tr>ABHILFE 12345</tr>  
    <tr>HINWEIS 12345</tr>  
    </table>  
    </body></html>  
      
    <html><body>  
    <script type="text/javascript">  
    eingabe1 = prompt( "Fehlernummer");  
    </script><table width="500">  
    <tr>die Nummer der Fehlermeldung lautet 12300</tr>  
    <tr>die beschreibung der fehlermeldung</tr>  
    <tr>beschreibung der abhilfe</tr>  
    <tr>ein allgemeiner </tr>  
    </table>  
    </body></html>  
      
    <html><body>  
    <script type="text/javascript">  
    eingabe1 = prompt( "Fehlernummer");  
    </script><table width="500">  
    <tr>die Nummer der Fehlermeldung lautet 12840</tr>  
    <tr>die beschreibung der fehlermeldung</tr>  
    <tr>beschreibung der abhilfe</tr>  
    <tr>ein allgemeiner </tr>  
    </table>  
    </body></html>  
    
    

    Wie du siehst, ist da erstens überhaupt keine prompt-Abfrage mehr drin, weil die innerhalb von xsl:variable stand und deshalb nicht berücksichtigt wird. Und da die Variable $Fehlernummer leer ist, trifft die test-Bedingung bei allen Datensätzen zu.

    Auf die Weise kannst du keine interaktive XSL-Transformation durchführen. Man KANN aus JavaScript heraus eine XSL-Transformation anstoßen und dann könnte man auch das XSLT-Dokument vor der Transformation so bearbeiten, dass eine Variable einen Wert bekommt, der auch schon als JavaScript-Variable vorliegt.

    Das ist allerdings nicht so einfach browserübergreifend umsetzbar. Im Firefox ginge es etwa so:

    <html><body>  
    <script type="text/javascript">  
    [code lang=javascript]  
    var xsltNamespace = "http://www.w3.org/1999/XSL/Transform";  
      
    var stylesheet = document.implementation.createDocument("", "test", null);  
    stylesheet.addEventListener("load", loadHandler, false);  
    stylesheet.load("auslesen.xsl");  
      
    var xmlData = document.implementation.createDocument("", "test", null);  
    xmlData.addEventListener("load", loadHandler, false);  
    xmlData.load("daten.xml");  
      
    var fehlernummer = window.prompt("Bitte Fehlernummer eingeben:");  
      
    function loadHandler () {  
     this.loaded = true;  
     if (stylesheet.loaded && xmlData.loaded) {  
      process();  
     }  
    }  
      
    function process () {  
     stylesheet.getElementsByTagNameNS(xsltNamespace, "variable").item(0).appendChild(  
      stylesheet.createTextNode(fehlernummer)  
     );  
     var processor = new XSLTProcessor();  
     processor.importStylesheet(stylesheet);  
     var newFragment = processor.transformToFragment(xmlData, document);  
     document.body.appendChild(newFragment);  
    }
    

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

    Da werden die beiden XML-Dateien geladen. Wenn sie geladen sind, wird in das variable-Element der mit prompt abgefragt Wert geschrieben. Dann wird der XSLT-Prozessor angeworfen und das Ergebnis ins gegenwärtige HTML-Dokument eingehängt.

    Das zugehörige Stylesheet:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
    <xsl:variable name="Fehlernummer" />  
    <xsl:template match="fehlermeldung">  
    <xsl:if test="contains(ueberschrift,$Fehlernummer)"><div xmlns="http://www.w3.org/1999/xhtml">  
    <h2><xsl:value-of select="ueberschrift" /></h2>  
    <p><xsl:value-of select="beschreibung" /></p>  
    <p><xsl:value-of select="abhilfe" /></p>  
    <p><xsl:value-of select="hinweis" /></p>  
    </div></xsl:if>  
    </xsl:template>  
    </xsl:stylesheet>
    

    Wenn JavaScript auf diese Weise XSLT kontrolliert, DANN können sie so zusammenarbeiten, dass eine JavaScript-Logik die XSLT-Logik beeinflusst. Anders gehts nicht.

    Das aber nur mal als theoretisches Beispiel, um den Unterschied zu verdeutlichen. JavaScript ist nicht das geeignete Mittel für solche Interaktivität. Besser man nutzt ein ganz einfaches HTML-Formular, das das Ergebnis an den Webserver sendet. Dort nimmt ein Script die Formulardaten entgegen und montiert den Wert in das variable-Element (ginge sicher besser, ich bin XSLT-Idiot). Dann wird die Transformation serverseitig durchgeführt und das Ergebnis an den Browser zurückgesendet. Das würde browserübergreifend funktionieren.

    Mathias