Beispiel einer XSL-Transformation mit Parameter und dynamischen XPath-Ausdruck

Thomas Darimont

Erfahrenes Mitglied
Hallo,

hier mal ein kleines Beispiel für eine XSL-Transformation eines XML Dokuments über ein XSL Stylesheet in ein HTML Dokument:

Unser Eingangsdokument:
Code:
<?xml version="1.0" encoding="ISO-8859-15"?>
<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>

Euro im XML durch & #8364; ersetzen

Unser Stylesheet:
XML:
<?xml version="1.0" encoding="ISO-8859-15"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" version="4.0" indent="yes"/>
<xsl:param name="tag"/>
    <xsl:template match="speiseplan">
        <html>
            <body>
                <h1><xsl:value-of select="$tag"/></h1>
                Suppen:<br/>
                    <xsl:for-each select="./*[name() = $tag]/Suppen/suppe">
                        <xsl:value-of select="beschreibung" />
                        <xsl:text disable-output-escaping="yes">&nbsp;</xsl:text>
                        <xsl:value-of select="preis" />
                        <br/>
                    </xsl:for-each>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

Unser Transformator
C#:
using System;
using System.Collections.Generic;
using System.Text;

using System.Xml;
using System.Xml.XPath;
using System.Xml.Xsl;
using System.IO;

namespace De.Tutorials.Training
{
    
    public class XsltTransformationExample
    {
        public static void Main(string[] args)
        {
            XPathDocument src = new XPathDocument(File.OpenRead(@"c:\input.xml"));
            XslCompiledTransform transform = new XslCompiledTransform();
            transform.Load(new XPathDocument(File.OpenRead(@"c:\stylesheet.xsl")));
            XsltArgumentList arguments = new XsltArgumentList();
            arguments.AddParam("tag", "", "Dienstag");
            transform.Transform(src,arguments,File.OpenWrite(@"c:\output.html"));
    
        }
    }
}

Hier das Ergebnis:
HTML:
<html>
  <body>
    <h1>Dienstag</h1>
                Suppen:<br>Spargelcremesuppe&nbsp;1,00 €<br>Tomatesuppe&nbsp;1,10 €<br></body>
</html>

Gruß Tom
 
Zuletzt bearbeitet von einem Moderator:
Zurück