<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<!-- XML Stylesheet zur Erzeugung von HTML

     Diese XSLT-Datei erzeugt eine HTML-Sitemap aus einer entsprechenden
     XML-Datei.

     Copyright (C) 2006 Robert Bienert,
     http://www.robertbienert.de/dokumente/web/sitemap/

     Dieser Inhalt steht unter der Creative Commons »Namensnennung
     2.0 Deutschland« Lizenz,
     siehe http://creativecommons.org/licenses/by/2.0/de/
  -->

<!-- FIXME
     Damit dieses Stylesheet korrekt transformieren kann, darf in der
     XML-Datei _kein_ Namensraum deklariert werden, weil das Stylesheet
     sonst seine Elemente nicht findet.
  -->
<!-- Kein XML-Prolog, weil wir lediglich die „Sitemap“ erzeugen,
     kein weiteres HTML darum herum.
  -->
<xsl:output omit-xml-declaration="yes" />

<xsl:template match="/">
	<!-- Das Toplevel-Element ist directory, d.h. steige direkt ein. -->
	<xsl:call-template name="directory">
		<xsl:with-param name="node" select="directory" />
		<xsl:with-param name="path" select="''" />
	</xsl:call-template>
</xsl:template>

<xsl:template name="directory">
	<!-- übergebene Parameter -->
	<xsl:param name="node" />
	<xsl:param name="path" />

	<!-- eigene, lokale Parameter -->
	<xsl:param name="newPath">
	<xsl:choose>
		<xsl:when test="boolean($node/@subpath)">
			<xsl:value-of select="$path" />
			<xsl:value-of select="$node/@subpath" />
		</xsl:when>
		<xsl:when test="boolean($node/@path)">
			<xsl:value-of select="$node/@path" />
		</xsl:when>
	</xsl:choose>
	</xsl:param>

	<!-- Ein directory ist total unspektakulär, es passiert hier
	     gar nichts, ausser dem Zusammensetzen des Pfades und dem
	     Iterieren durch alle Verzeichniseinträge.
	  -->
	<ul>
		<xsl:for-each select="$node/item">
			<xsl:call-template name="item">
				<xsl:with-param name="node" select="." />
				<xsl:with-param name="path" select="$newPath" />
			</xsl:call-template>
		</xsl:for-each>
	</ul>
</xsl:template>

<xsl:template name="item">
	<!-- === übergebene Parameter === -->
	<xsl:param name="node" />
	<xsl:param name="path" />

	<!-- === eigene, lokale Parameter === -->
	<!-- Mit dieser Abfrage trage ich den verschiedenen Möglichkeiten
	     des Pfad-Zusammensetzens Rechnung, schließlich soll die
	     Sitemap auch mit relativen Pfaden zurechtkommen.
	  -->
	<xsl:param name="thePath">
	<xsl:choose>
		<xsl:when test="boolean($node/@path)">
			<xsl:value-of select="$node/@path" />
		</xsl:when>
		<xsl:when test="string-length($node/@subpath) = 0">
			<xsl:value-of select="$path" />
		</xsl:when>
		<xsl:when test="boolean($node/@subpath)">
			<xsl:value-of select="$path" />
			<xsl:text>/</xsl:text>
			<xsl:value-of select="$node/@subpath" />
		</xsl:when>
	</xsl:choose>
	</xsl:param>

	<!-- Baue mir einen HTML-Verzeichniseintrag -->
	<li><a><xsl:attribute name="href"><xsl:value-of select="$thePath" /></xsl:attribute>
	<xsl:value-of select="$node/@title" /></a>
	<xsl:if test="boolean($node/@desc)">
		<xsl:text> – </xsl:text><xsl:value-of select="$node/@desc" />
	</xsl:if>

	<!-- Mache im nächsten directory weiter, falls es existiert. -->
	<xsl:if test="boolean($node/directory)">
		<xsl:call-template name="directory">
			<xsl:with-param name="node" select="$node/directory" />
			<xsl:with-param name="path">
			<xsl:choose>
				<xsl:when test="boolean($node/@subpath)">
					<xsl:value-of select="$path" />
				</xsl:when>
				<xsl:otherwise>
					<xsl:value-of select="$node/@path" />
				</xsl:otherwise>
			</xsl:choose>
			</xsl:with-param>
		</xsl:call-template>
	</xsl:if>
	</li>
</xsl:template>

</xsl:stylesheet>

