Dynamisches XSLT? Newbie braucht Hilfe

Ravey76

Grünschnabel
Hallo Allerseits,

vor Kurzem habe ich mich an das Thema "XML & XSLT" heran gewagt und komme soweit ganz gut zurecht. Nun habe ich mich an ein kleines Projekt heran gewagt, wo ich auf ein (für mich sehr grosses) Problem gestossen bin.

Mein Problem:

Ich möchte eine Website mit einem Lexikon machen, in welchem alphabetisch Orte und Beschreibungen aus Island angezeigt werden. Den dazugehörigen Datensatz hab ich in einer XML-Datei in diesem Format geschrieben:

< EINTRAG >
< BUCHSTABE > A < /BUCHSTABE >
< ORT > Aðalbólsheiði < /ORT >
< TYP > Heide < /TYP >
< KOORDN > 65°05'60"N < /KOORDN >
< KOORDW > 20°30'00"W < /KOORDW >
< CONTENT > Ein Heidegebiet zwischen den Flüssen Austurá und Víðidalsá. Südlich davon befindet sich der Gletscher Eíriksjökull< /CONTENT >
< /EINTRAG >

Mittels einer XSLT-Datei lese ich die Daten aus und gebe sie auf der Internetseite wieder. Mit dem Befehl:

< xsl:for-each select="LEXIKON/EINTRAG[BUCHSTABE='[b]A[/b]']" >
< xsl:sort select="ORT"/ >

kann ich sämtliche Einträge des Buchstaben "A" ausgeben (alles andere wird ignoriert).

Nun möchte ich aber, dass wenn ich auf einen Link klicke (zB "Buchstabe B") alle Daten nur aus "B" ausgelesen werden. Theoretisch geht das mit

< xsl:for-each select="LEXIKON/EINTRAG[BUCHSTABE='[b]B[/b]']" >

Nun meine Frage:
Wie kann ich dieses [BUCHSTABE='B'] dynamisch gestalten, so dass der Wert "B" gegen das ausgetauscht wird, was gerade angeklickt wird (zB "c" oder "d"?). Ich habs mit einer Variablen versucht:

< xsl:for-each select="LEXIKON/EINTRAG[BUCHSTABE='[b]{$wert}[/b]']" >

$wert habe ich vorher definiert (mit VARIABLE name="wert" etc). Leider klappt das alles nicht.

Wie gehe ich am Besten vor? Wie kann ich dieses Problem lösen?
Würde mich freuen wenn mir da jemand helfen könnte.

Danke im Vorraus,
Ravey76

 

warrel

Grünschnabel
Hast du es schon mal mit <xsl:param> versucht? Damit kann man für <xsl:apply-templates>, aber auch für ein ganzes Stylesheet, Parameter definieren.Ich nutze das mit Direktaufruf von XALAN, um nur Teile von XML-Dokumenten auszugeben, immmer aber mit dem gleichen Stylesheet. Ob das aus Browser auch , weiss ich aber nicht..

CU thomas
 
Zuletzt bearbeitet:

Ravey76

Grünschnabel
Hallo Thomas,

ja, ich hab <xsl:param> als Erstes probiert, leider hat das nicht geklappt.

Habe die letzten paar Tage an dem Problem zusammen mit einem Arbeitskollegen gesessen. Der Kollege hat dann bei PHP5 etwas Hochinteressantes gelesen & die Spur weiterverfolgt -> Lösung gefunden!
1.) man erstelt eine XML, eine XSL und eine PHP-Datei
2.) die PHP-Datei generiert ein DOMdocument (?, hoffe das schreib ich jetzt richtig)
3.) man übergibt die Variable via URL an die PHP-Datei (zB. index.php?wert=A)
4.) die PHP-Datei haut dann die XML & XSL-Datei zusammen (unter berücksichtigung der Variable) und gibt als Ergebnis die gewünschte Seite raus ...

Ich hoffe ich hab das jetzt richtig zusammen gefasst, als Newbie hat man ja immer so seine Probleme, alles verständlich rüber zu bringen :)

Unten im Anhang mal die PHP-Datei, falls jemand mal das Gleiche Problem hat.

viele Grüße,
Ravey76

Hier die wichtige PHP-Datei ( NUR bei PHP5 mit DOM-extensions):
(Variablenwert via URL übergeben > zB: Link.php?name=A)

<?php

// Load style sheet
$xsl = new DOMDocument;
$xsl->load('template.xml'); // Info: oder auch template.xsl

// Configure the transformer
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl); // attach the xsl rules

// Load the XML source
$xml = new DOMDocument;
$xml->load('lexikon.xml');

// Set filter parameter
$proc->setParameter('', 'buchstabe', $name);

// Save filtered output in DOM object
$translated_dom = $proc->transformToDoc($xml);

// Save output in string
$translated_html = $translated_dom->saveHTML();

// output
echo $translated_html;

?>

Inhalt XSL-Datei (Beispiel):

<?xml version="1.0" encoding="ISO-8859-1" ?>
- <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
- <xsl:template match="/">
- <html>
- <body>
- <table>
- <tr bgcolor="#F2F2F2">
<th align="left" style="font-size: 14px; color: #F2F2F2;">ABC</th>
</tr>
- <xsl:for-each select="LEXIKON/EINTRAG[BUCHSTABE=$buchstabe]">
- <tr>
- <td width="5%" style="font-family: arial, helvetica, sans-serif; font-size: 14px; font-weight: bold; color: #444444;"><xsl:value-of select="BUCHSTABE"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

Inhalt XML-Datei (Beispiel):

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="template.xml"?>

<LEXIKON>
<EINTRAG>
<BUCHSTABE>A</BUCHSTABE>
<ORT>Atlantis</ORT>
<TYP>Insel</TYP>
<GEBIET>Nimmerland</GEBIET>
<KOORDN>165°01'00" N</KOORDN>
<KOORDW>-15°34'00" W</KOORDW>
<CONTENT>Blindtext</CONTENT>
</EINTRAG>
</LEXIKON>