# XSL - select mit Parameter



## cyberscout (13. Februar 2005)

Hallo,

das ist mein erstes XSL-Projekt(chen) und ich hab leider nicht sehr viel Zeit, um es zu realisieren.
Es geht darum, einen Speiseplan, der in XML vorliegt, in ein CMS einzupflegen.
Der Speiseplan enthält fünf Wochentage (Mo-Fr) und die entsprechenden Essenskategorien und einzelnen Gerichte des Tages. (siehe speiseplan.xml.txt)

Dieser Plan soll auf 5 verschiedene HTML-Seiten aufgeteilt werden. (für jeden Tag eine)
Also muss ich dem XSL einen Parameter mitgeben, welche Wochentag aus dem XML gelesen werden soll. Als Prozessor benutze ich übrigens Xalan.

Wenn ich es so mache wie im Anhang (siehe speiseplan.xsl.txt), steht ja nur ein Tag fest codiert drin (z.B. Montag). Hier bräuchte ich einen Parameter, um mit Xalan das XSL für jeden Tag einmal aufzurufen. Bloß sind ja Parameter und Variablen in den select-Attributen nicht erlaubt.
Ich hab mal was von irgendwelchen Xalan-Extensions gehört, die einem das erlauben. Bloß gefunden hab ich nix Sinnvolles.

Kann mir jemand weiterhelfen?
Danke!

cyberscout


----------



## Thomas Darimont (13. Februar 2005)

Hallo!

Verwendest du die Java Version von Xalan?
... diesem kannst du aber einen Parameter mitgeben:
http://xml.apache.org/xalan-j/commandline.html
wenn das per Kommandozeile geht klappt's sicherlich auch programatisch.
Du willst ja eigentlich nur eine XPath Anweisung von dem Parameter (Wochentag) abhänig machen, richtig?

... und wie du mittels der Xalan Extensions Java Code ausführen kannst findest du hier:
http://www.tutorials.de/tutorials190677.html

Gruß Tom


----------



## Thomas Darimont (13. Februar 2005)

Hallo!

Das hier funktioniert:

Die häßlichen if-Blocks sind leider notwendig, da man mit Hausmitteln (d.h. ohne Xalan extensions) anscheinend keine "dynamischen" XPath Ausdrücke bauen kann...
eine mögliche Lösung dazu wäre folgende:
http://www.stylusstudio.com/xsllist/200412/post41140.html

( Aufbauend auf Java 5.0)

```
/*
 * Created on 13.02.2005@14:53:03
 *
 * TODO Licence info
 */
package de.tutorials;

import java.io.File;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import javax.xml.xpath.XPathExpressionException;

/**
 * @author Administrator
 *
 * TODO Explain me
 */
public class XSLTExample {

    public static void main(String[] args) throws ParserConfigurationException, XPathExpressionException {
        try {
            Transformer t = TransformerFactory.newInstance().newTransformer(
                    new StreamSource(new File("H:/xml/test1/process.xsl")));

            t.setParameter("tag", "Dienstag");

            t.transform(new StreamSource(new File("H:\\xml\\test1\\data.xml")),
                    new StreamResult(new File("H:\\xml\\test1\\out.xml")));

        } catch (TransformerConfigurationException e) {
            e.printStackTrace();
        } catch (TransformerFactoryConfigurationError e) {
            e.printStackTrace();
        } catch (TransformerException e) {
            e.printStackTrace();
        }
    }
}
```

Data.xml:

```
<?xml version="1.0" encoding="UTF-8"?>
<speiseplan>
	<Montag>
		<Suppen>
			<suppe>
				<beschreibung>Hühnersuppe</beschreibung>
				<preis>1,00 €</preis>
			</suppe>
			<suppe>
				<beschreibung>Kartoffelsuppe</beschreibung>
				<preis>1,40 €</preis>
			</suppe>
		</Suppen>
		<Vorspeisen>
			<vorspeise>
				<beschreibung>Vorspeise 1</beschreibung>
				<preis>1,20 €</preis>
			</vorspeise>
		</Vorspeisen>
		<Hauptgerichte>
			<hauptgericht>
				<beschreibung>Seelachsfilet mit Soße</beschreibung>
				<preis>2,50 €</preis>
			</hauptgericht>
			<hauptgericht>
				<beschreibung>Thüringer Rostbratwürste</beschreibung>
				<preis>2,00 €</preis>
			</hauptgericht>
		</Hauptgerichte>
	</Montag>
	<Dienstag>
		<Suppen>
			<suppe>
				<beschreibung>Spargelcremesuppe</beschreibung>
				<preis>1,00 €</preis>
			</suppe>
			<suppe>
				<beschreibung>Tomatesuppe</beschreibung>
				<preis>1,10 €</preis>
			</suppe>
		</Suppen>
		<Vorspeisen>
			<vorspeise>
				<beschreibung>kleiner Salatteller</beschreibung>
				<preis>1,20 €</preis>
			</vorspeise>
		</Vorspeisen>
		<Hauptgerichte>
			<hauptgericht>
				<beschreibung>Chili con Carne</beschreibung>
				<preis>2,50 €</preis>
			</hauptgericht>
			<hauptgericht>
				<beschreibung>Lasagne</beschreibung>
				<preis>2,00 €</preis>
			</hauptgericht>
		</Hauptgerichte>
	</Dienstag>
</speiseplan>
```

Process.xml:

```
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="tag"/>
	<xsl:template match="speiseplan">
		<html>
			<body>
				<h1><xsl:value-of select="$tag"/></h1>
				Suppen:<br/>
				<xsl:if test="$tag = 'Montag'">
					<xsl:for-each select="Montag/Suppen/suppe">
						<xsl:value-of select="beschreibung" />
						<xsl:value-of select="preis" />
						<br/>
					</xsl:for-each>
				</xsl:if>
				<xsl:if test="$tag = 'Dienstag'">
					<xsl:for-each select="Dienstag/Suppen/suppe">
						<xsl:value-of select="beschreibung" />
						<xsl:value-of select="preis" />
						<br/>
					</xsl:for-each>
				</xsl:if>
				<xsl:if test="$tag = 'Mittwoch'">
					<xsl:for-each select="Mittwoch/Suppen/suppe">
						<xsl:value-of select="beschreibung" />
						<xsl:value-of select="preis" />
						<br/>
					</xsl:for-each>
				</xsl:if>
				<xsl:if test="$tag = 'Donnerstag'">
					<xsl:for-each select="Donnerstag/Suppen/suppe">
						<xsl:value-of select="beschreibung" />
						<xsl:value-of select="preis" />
						<br/>
					</xsl:for-each>
				</xsl:if>
				<xsl:if test="$tag = 'Freitag'">
					<xsl:for-each select="Freitag/Suppen/suppe">
						<xsl:value-of select="beschreibung" />
						<xsl:value-of select="preis" />
						<br/>
					</xsl:for-each>
				</xsl:if>
				<xsl:if test="$tag = 'Samstag'">
					<xsl:for-each select="Samstag/Suppen/suppe">
						<xsl:value-of select="beschreibung" />
						<xsl:value-of select="preis" />
						<br/>
					</xsl:for-each>
				</xsl:if>
				<xsl:if test="$tag = 'Sonntag'">
					<xsl:for-each select="Sonntag/Suppen/suppe">
						<xsl:value-of select="beschreibung" />
						<xsl:value-of select="preis" />
						<br/>
					</xsl:for-each>
				</xsl:if>
			</body>
		</html>
	</xsl:template>
	
</xsl:stylesheet>
```

Ausgabe:
out.xml

```
<html>
<body>
<h1>Dienstag</h1>
				Suppen:<br>Spargelcremesuppe1,00 &euro;<br>Tomatesuppe1,10 &euro;<br>
</body>
</html>
```

HTH,

Gruß Tom


----------

