Übergabeprameter in XSL ermitteln
Biks
- xsl
0 Thomas J.S.
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
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
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.
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/#m940434Grüß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() > 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
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
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.