<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs ="http://www.w3.org/2001/XMLSchema"
xmlns:pre="http://www.vishia.de/2006/XhtmlPre"
xmlns:xhtml="http://www.w3.org/1999/xhtml"
>
<xsl:output method="html" encoding="iso-8859-1"/>
<xs:annotation><xs:documentation>
Datum Wer Beschreibung der Änderung
2006-07-18 hartmutS anchor not only at start of chapter, also inside.
2005-12-14 hartmutS Initial-Revision
</xs:documentation></xs:annotation>
<xsl:variable name="testOutput">0</xsl:variable>
<xsl:param name="cssHtml">htmlstd.css</xsl:param>
<!-- xsl:preserve-space elements="p" / -->
<xsl:template match="/">
<html test_rootname="{local-name(*)}"><!-- test1 to test the name of the root element. -->
<xsl:apply-templates select="root|pre:Chapters" />
<xsl:if test="not(root/pre:Chapters | pre:Chapters)">
<head></head>
<body><p><xsl:text>Error no input Xml-Docs found using Pre2Xhtml.xsl.</xsl:text></p></body>
</xsl:if>
</html>
</xsl:template>
<xsl:template match="root">
<!-- test_root /-->
<xsl:for-each select="*">
<test_inputXmlRoot name="local-name(.)" />
</xsl:for-each>
<xsl:apply-templates select="pre:Chapters" />
</xsl:template>
<xsl:template match= "pre:Chapters">
<head>
<!-- title><xsl:value-of select="pre:Chapters/@title" /></title -->
<title><xsl:value-of select="@title" /></title>
<link rel="stylesheet" type="text/css" href="{$cssHtml}" />
<!-- xsl:copy-of select="/root/style" / --><!-- copy the css-style-definitions -->
</head>
<body>
<h1><xsl:value-of select="@title"/></h1><!-- The title of the whole html document. -->
<xsl:call-template name="directory" />
<hr />
<xsl:apply-templates select="xhtml:body" /><!-- any paragraphs before the first chapter. -->
<xsl:for-each select="pre:chapter">
<xsl:apply-templates select="."><!-- the pre:chapter -->
<xsl:with-param name="chapterNr">
<xsl:value-of select="position()"/>
</xsl:with-param>
<xsl:with-param name="chapterLevel" select="2" />
<!-- nested chapters are called recursively. -->
</xsl:apply-templates>
</xsl:for-each>
</body>
</xsl:template>
<xsl:template name="directory">
<p class="standard"><font size="+1"><u>Inhalt</u></font></p>
<xsl:call-template name="directory-intern">
</xsl:call-template>
</xsl:template>
<xsl:template name="directory-intern">
<xsl:param name="chapterNr"/>
<xsl:if test="count(pre:chapter)>0">
<ul>
<xsl:for-each select="pre:chapter">
<xsl:variable name="chapterNr1">
<xsl:value-of select="$chapterNr"/><!-- empty on h1-level, end with dot on deeper level -->
<xsl:value-of select="position()"/>
</xsl:variable>
<xsl:variable name="label">#chapter_<xsl:value-of select="$chapterNr1"/></xsl:variable>
<li><a href="{$label}"><xsl:value-of select="$chapterNr1"/><xsl:text> </xsl:text><xsl:value-of
select="pre:title"/></a></li>
<!-- recursive call of nested chapters if present-->
<xsl:call-template name="directory-intern">
<xsl:with-param name="chapterNr"><xsl:value-of select="$chapterNr1"/><xsl:text>.</xsl:text></xsl:with-param>
</xsl:call-template>
</xsl:for-each>
</ul>
</xsl:if>
</xsl:template>
<!-- write one chapter with its title and content and nested chapters. -->
<xsl:template match="pre:chapter">
<xsl:param name="chapterLevel">-</xsl:param>
<xsl:param name="chapterNr"></xsl:param>
<xsl:if test="@breakPage='before'">
<hr/><hr/><hr/><!-- breakpage shown as 3 horizontal lines -->
</xsl:if>
<!-- set an anchor for navigation from generated directory, style: <a name="chapter_3.2.1"/> -->
<xsl:variable name="label">chapter_<xsl:value-of select="$chapterNr"/></xsl:variable>
<a id="{generate-id()}" name="{$label}"/>
<xsl:if test="count(@id)>0"><a id="{generate-id()}" name="{@id}" /></xsl:if>
<xsl:variable name="chapterId" select="@id" /><!-- may be emtpy -->
<!-- xsl:apply-templates select="anchor"/ -->
<!-- write the chapter title line, with the header style dependeded on the chapterLevel -->
<xsl:variable name="hx">h<xsl:value-of select="$chapterLevel"/></xsl:variable><!-- h1, h2 etc. -->
<xsl:element name="{$hx}"> <!-- produce h1, h2 etc. -->
<xsl:value-of select="$chapterNr"/><xsl:text> </xsl:text><!-- numbering of the chapter on title -->
<!-- TODO: xsl:attribute doesn't work in this context, therefore a name="@id" above! -->
<!-- xsl:if test="count(@id)>0"><xsl:attribute name="id"><xsl:value-of select="@id" /></xsl:attribute></xsl:if -->
<!-- NOTE also the test using chapterId fails. -->
<!-- xsl:if test="string-length($chapterId)>0"><xsl:attribute name="id"><xsl:value-of select="$chapterId"
/></xsl:attribute></xsl:if -->
<xsl:apply-templates select="pre:title"/>
</xsl:element>
<!-- write the textual content of this chapter level (no yet nested chapters) -->
<xsl:apply-templates select="xhtml:body|pre:img|img">
</xsl:apply-templates>
<!-- write nested chapters -->
<xsl:for-each select="pre:chapter">
<xsl:apply-templates select=".">
<xsl:with-param name="chapterNr">
<xsl:value-of select="$chapterNr"/>
<xsl:text>.</xsl:text>
<xsl:value-of select="position()"/>
</xsl:with-param>
<xsl:with-param name="chapterLevel" select="number($chapterLevel+1)" />
</xsl:apply-templates>
</xsl:for-each>
</xsl:template>
<xsl:template match="xhtml:body">
<xsl:if test="boolean(@id)"><a id="{generate-id()}" name="{@id}" /></xsl:if>
<div class="{@class}">
<xsl:if test="boolean(@id)"><xsl:attribute name="id"><xsl:value-of select="@id" /></xsl:attribute></xsl:if>
<xsl:apply-templates />
</div>
<br clear="all" /><!-- to force break if any img is above. -->
</xsl:template>
<xsl:template match="xhtml:div"><!-- some textual content with a section style, possible overloadable by user. -->
<xsl:if test="boolean(@id)"><a id="{generate-id()}" name="{@id}" /></xsl:if>
<div class="{@class}">
<xsl:apply-templates/>
</div>
</xsl:template>
<xsl:template match="xhtml:dl"><!-- some textual content with a section style, possible overloadable by user. -->
<xsl:if test="boolean(@id)"><a id="{generate-id()}" name="{@id}" /></xsl:if>
<dl class="{@class}">
<xsl:apply-templates/>
</dl>
</xsl:template>
<xsl:template match="xhtml:dt"><!-- some textual content with a section style, possible overloadable by user. -->
<xsl:if test="boolean(@id)"><a id="{generate-id()}" name="{@id}" /></xsl:if>
<dt class="{@class}"><!-- the style must be defined in HTML with #name -->
<xsl:apply-templates/>
</dt>
</xsl:template>
<xsl:template match="xhtml:dd"><!-- some textual content with a section style, possible overloadable by user. -->
<xsl:if test="boolean(@id)"><a id="{generate-id()}" name="{@id}" /></xsl:if>
<dd class="{@class}"><!-- the style must be defined in HTML with #name -->
<xsl:apply-templates/>
</dd>
</xsl:template>
<xsl:template match="xhtml:p">
<xsl:if test="boolean(@id)"><a id="{generate-id()}" name="{@id}" /></xsl:if>
<p class="{@class}">
<xsl:apply-templates
select="text()|xhtml:b|xhtml:i|xhtml:stroke|xhtml:em|xhtml:u|xhtml:code|xhtml:span|xhtml:br|xhtml:a|xhtml:img"/>
!-- select see PreHtml.xsd -->
</p>
</xsl:template>
<xsl:template match="xhtml:span">
<xsl:if test="text()|b|i|u|br|fileref|internref" ><!-- only if any content is found, otherwise the emtpy <span/> is
destructive i html. -->
<span class="{@class}">
<xsl:call-template name="copyId" />
<xsl:apply-templates select="text()|b|i|u|br|fileref|internref"/><!-- select see PreHtml.xsd -->
</span>
</xsl:if>
</xsl:template>
<xsl:template match="xhtml:ul">
<xsl:if test="boolean(@id)"><a id="{generate-id()}" name="{@id}" /></xsl:if>
<xsl:choose><xsl:when test="count(@class)>0">
<ul class="{@class}">
<xsl:apply-templates/>
</ul>
</xsl:when><xsl:otherwise>
<ul><xsl:apply-templates/></ul>
</xsl:otherwise></xsl:choose>
</xsl:template>
<xsl:template match="xhtml:li">
<xsl:if test="boolean(@id)"><a id="{generate-id()}" name="{@id}" /></xsl:if>
<xsl:choose><xsl:when test="count(@class)>0">
<li class="{@class}">
<xsl:apply-templates/>
</li>
</xsl:when><xsl:otherwise>
<li><xsl:apply-templates/></li>
</xsl:otherwise></xsl:choose>
</xsl:template>
<xsl:template match="xhtml:table">
<xsl:if test="boolean(@id)"><a id="{generate-id()}" name="{@id}" /></xsl:if>
<table class="{@class}">
<xsl:if test="@border"><xsl:attribute name="border"><xsl:value-of select="@border" /></xsl:attribute></xsl:if>
<xsl:apply-templates><xsl:with-param name="classTable" select="@class" /></xsl:apply-templates>
</table>
</xsl:template>
<xsl:template match="xhtml:tr">
<xsl:param name="classTable" />
<tr class="{$classTable}"><xsl:apply-templates><xsl:with-param name="classTable" select="$classTable"
/></xsl:apply-templates></tr>
</xsl:template>
<xsl:template match="xhtml:th">
<xsl:param name="classTable" />
<th class="{$classTable}">
<xsl:if test="@colspan"><xsl:attribute name="colspan"><xsl:value-of select="@colspan" /></xsl:attribute></xsl:if>
<xsl:if test="@class"><xsl:attribute name="class"><xsl:value-of select="@class" /></xsl:attribute></xsl:if>
<xsl:apply-templates></xsl:apply-templates>
</th>
</xsl:template>
<xsl:template match="xhtml:td">
<xsl:param name="classTable" />
<td class="{$classTable}">
<xsl:if test="@colspan"><xsl:attribute name="colspan"><xsl:value-of select="@colspan" /></xsl:attribute></xsl:if>
<xsl:if test="@class"><xsl:attribute name="class"><xsl:value-of select="@class" /></xsl:attribute></xsl:if>
<xsl:apply-templates></xsl:apply-templates>
</td>
</xsl:template>
<xsl:template match="xhtml:pre">
<xsl:if test="boolean(@id)"><a id="{generate-id()}" name="{@id}" /></xsl:if>
<xsl:choose><xsl:when test="count(@class)>0">
<pre class="{@class}">
<xsl:apply-templates/>
</pre>
</xsl:when><xsl:otherwise>
<pre><xsl:apply-templates/></pre>
</xsl:otherwise></xsl:choose>
</xsl:template>
<xsl:template match="xhtml:p/xhtml:xxximg">
<!-- the tag ist the same like html, copy also all attributes! -->
<xsl:if test="boolean(@id)"><a id="{generate-id()}" name="{@id}" /></xsl:if>
<xsl:copy-of select="."/>
</xsl:template>
<xsl:template match="xhtml:img|img">
<!-- the tag ist the same like html, copy also all attributes! -->
<xsl:if test="boolean(@id)"><a id="{generate-id()}" name="{@id}" /></xsl:if>
<!-- xsl:copy-of select="."/ -->
<br clear="all" /><!-- to force break if any other img is above. -->
<a href="{@src}">
<img src="{@src}">
<xsl:if test="count(@height)>0"><xsl:attribute name="height"><xsl:value-of
select="@height"/></xsl:attribute></xsl:if>
<xsl:if test="count(@width)>0"><xsl:attribute name="width"><xsl:value-of
select="@width"/></xsl:attribute></xsl:if>
<xsl:if test="count(@align)>0"><xsl:attribute name="align"><xsl:value-of
select="@align"/></xsl:attribute></xsl:if>
<xsl:if test="count(@usemap)>0"><xsl:attribute name="usemap"><xsl:value-of
select="@usemap"/></xsl:attribute></xsl:if>
<xsl:if test="count(@border)>0"><xsl:attribute name="border"><xsl:value-of
select="@border"/></xsl:attribute></xsl:if>
<xsl:copy-of select="map"/><!-- if an image map exists -->
</img>
<xsl:if test="count(@title)>0 and @title!='.'">
<span class="ImageTitle"><xsl:text>Bild: </xsl:text><xsl:value-of select="@title"/></span>
</xsl:if>
</a>
</xsl:template>
<xsl:template match="xhtml:anchor">
<a id="{generate-id()}" name="{@label}" />
</xsl:template>
<xsl:template match="xhtml:a">
<xsl:if test="boolean(@href)">
<a href="{@href}"><xsl:apply-templates/></a>
</xsl:if>
<xsl:if test="boolean(@name)">
<a id="{generate-id()}" name="{@name}"><xsl:apply-templates/></a>
</xsl:if>
</xsl:template>
<xsl:template match="internref">
<xsl:variable name="label1">#<xsl:value-of select="@label"/></xsl:variable>
<a href="{$label1}"><xsl:apply-templates/></a>
</xsl:template>
<xsl:template match="fileref">
<!-- a fileref is a hyperlink to the external file. -->
<xsl:variable name="NAME"><xsl:value-of select="translate(@name,'\','/')"/></xsl:variable>
<a href="{$NAME}"><xsl:apply-templates/></a>
</xsl:template>
<xsl:template match="xhtml:i">
<i><xsl:apply-templates/></i>
</xsl:template>
<xsl:template match="xhtml:em">
<em><xsl:apply-templates/></em>
</xsl:template>
<xsl:template match="xhtml:stroke">
<b><xsl:apply-templates/></b>
</xsl:template>
<xsl:template match="xhtml:u">
<u><xsl:apply-templates/></u>
</xsl:template>
<xsl:template match="xhtml:b">
<b><xsl:apply-templates/></b>
</xsl:template>
<xsl:template match="xhtml:br">
<br/>
</xsl:template>
<xsl:template match="xhtml:font">
<xsl:copy-of select="."/>
</xsl:template>
<xsl:template match="xhtml:code">
<xsl:if test="count(text()|*)>0">
<code><xsl:apply-templates/></code>
</xsl:if>
</xsl:template>
<!-- xsl:template match="text()">
<xsl:copy-of select="."/>
</xsl:template -->
<xsl:template match="pre:testOutput">
<xsl:if test="$testOutput>=@level">
<p><xsl:apply-templates select="text()"/></p>
<xsl:apply-templates select="*"/>
</xsl:if>
</xsl:template>
<xsl:template name="copyId">
<xsl:if test="@id"><xsl:attribute name="id"><xsl:value-of select="@id" /></xsl:attribute></xsl:if>
</xsl:template>
</xsl:stylesheet>