<xsl:stylesheet
version="1.0"
xmlns=""
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
exclude-result-prefixes="#default"
>
<!-- ===============================================================
Converts ESV XML into XHTML.
Loosely based on the PHP script on the ESV website with added
footnote handling. Note that the XML must have been formatted
with the "base-element=paragraph" option for this to work.
Version 1.0 BPE 29/07/2003
=============================================================== -->
<xsl:output
method="xml"
omit-xml-declaration="yes"
encoding="utf-8"
indent="yes"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
/>
<!-- This is provided by the calling script: the stylesheet name -->
<xsl:param name="style"/>
<!-- The name of the main script (used to make links) -->
<xsl:param name="script" select="'lookup.php'"/>
<!-- Main page template ============================================ -->
<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml">
<!-- Page header section with title and stylesheet -->
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<link rel="stylesheet" type="text/css" href="{$style}"/>
<title><xsl:apply-templates select="//passage/reference"/></title>
</head>
<!-- Page body -->
<body>
<!-- Title: the Bible reference of the passage being viewed -->
<h2>
<xsl:apply-templates select="//passage/reference"/>
</h2>
<!-- Do the passage text -->
<div id="text">
<xsl:apply-templates select="//passage/content"/>
</div>
<!-- Do footnotes section -->
<xsl:if test="count(//footnote)">
<div id="footnotes">
<h3>Footnotes</h3>
<ul>
<xsl:apply-templates select="//footnote" mode="footnotes"/>
</ul>
</div>
</xsl:if>
<!-- Navigation -->
<div id="navig">
<table>
<xsl:apply-templates select="//passage/surrounding-chapters/*"/>
</table>
</div>
<!-- Do the copyright notice -->
<div id="copyright">
<xsl:apply-templates select="//copyright"/>
</div>
<!-- link to home page -->
<div id="gohome">
<p><a href="http://www.edginet.org/">Ben's homepage</a></p>
</div>
</body>
</html>
</xsl:template>
<!-- =============================================================== -->
<xsl:template match="content">
<xsl:variable name="length" select="string-length(.) div 2"/>
<xsl:variable name="break">
<xsl:call-template name="find-break">
<xsl:with-param name="position" select="1"/>
<xsl:with-param name="total-length" select="$length"/>
</xsl:call-template>
</xsl:variable>
<table>
<tr>
<xsl:variable name="col-1" select="verse-unit[position() < $break]"/>
<td id="col-1">
<xsl:apply-templates select="$col-1"/>
<!-- Fix-up any unclosed paragraphs -->
<xsl:if test="count($col-1//begin-paragraph) > count($col-1//end-paragraph)">
<xsl:text disable-output-escaping="yes"></p></xsl:text>
</xsl:if>
</td>
<xsl:variable name="col-2" select="verse-unit[position() >= $break]"/>
<td id="col-2">
<!-- Fix-up any unopened paragraphs -->
<xsl:if test="count($col-2//end-paragraph) > count($col-2//begin-paragraph)">
<xsl:text disable-output-escaping="yes"><p class="fake"></xsl:text>
</xsl:if>
<xsl:apply-templates select="$col-2"/>
</td>
</tr>
</table>
</xsl:template>
<xsl:template name="find-break">
<xsl:param name="position"/>
<xsl:param name="length" select="0"/>
<xsl:param name="total-length"/>
<xsl:choose>
<xsl:when test="$total-length > $length">
<xsl:variable name="verse" select="(//content/verse-unit)[$position]"/>
<xsl:call-template name="find-break">
<xsl:with-param name="position" select="$position + 1"/>
<xsl:with-param name="length" select="$length + string-length($verse)"/>
<xsl:with-param name="total-length" select="$total-length"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$position"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- Templates for the various elements we are keeping ============= -->
<!-- This is the Bible reference for the text we are looking at -->
<xsl:template match="reference">
<xsl:apply-templates/>
</xsl:template>
<!-- Navigation links -->
<xsl:template match="previous|current|next">
<td id="{name()}">
<xsl:if test="text()">
<a href="{$script}?passage={text()}" title="{text()}">
<xsl:if test="name()='previous'">Previous chapter</xsl:if>
<xsl:if test="name()='current'">This chapter</xsl:if>
<xsl:if test="name()='next'">Next chapter</xsl:if>
</a>
</xsl:if>
<xsl:text> </xsl:text> <!-- prevent span tags from being abbreviated -->
</td>
</xsl:template>
<!-- Top level section headings -->
<xsl:template match="heading">
<h3>
<xsl:call-template name="copy-attributes"/>
<xsl:apply-templates/>
</h3>
</xsl:template>
<!-- Next level section headings -->
<xsl:template match="subheading">
<h4>
<xsl:call-template name="copy-attributes"/>
<xsl:apply-templates/>
</h4>
</xsl:template>
<xsl:template match="begin-paragraph">
<xsl:text disable-output-escaping="yes"><p</xsl:text>
<!-- copy any class info -->
<xsl:if test="@class">
<xsl:text> class="</xsl:text>
<xsl:value-of select="@class"/>
<xsl:text>"</xsl:text>
</xsl:if>
<xsl:text disable-output-escaping="yes">></xsl:text>
</xsl:template>
<xsl:template match="end-paragraph">
<xsl:text disable-output-escaping="yes"></p></xsl:text>
</xsl:template>
<!--
This is not as general as the PHP script, but is sufficient
according to the DTD
-->
<xsl:template match="begin-line">
<xsl:text disable-output-escaping="yes"><span</xsl:text>
<xsl:choose>
<xsl:when test="@class='indent'">
<xsl:text> class="indent1"</xsl:text>
</xsl:when>
<xsl:when test="@class='indent-2'">
<xsl:text> class="indent2"</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text> class="indent0"</xsl:text>
</xsl:otherwise>
</xsl:choose>
<xsl:text disable-output-escaping="yes">></xsl:text>
<!--
<xsl:if test="ancestor::woc">
<xsl:text disable-output-escaping="yes"><span class="woc"></xsl:text>
</xsl:if>
-->
</xsl:template>
<!-- Line breaks -->
<xsl:template match="end-line">
<!--
<xsl:if test="ancestor::woc">
<xsl:text disable-output-escaping="yes"></span></xsl:text>
</xsl:if>
-->
<xsl:text disable-output-escaping="yes"></span></xsl:text>
</xsl:template>
<!-- Ordinary verse numbers -->
<xsl:template match="verse-num">
<span class="verse-num">
<xsl:text> </xsl:text>
<xsl:apply-templates/>
<!-- prevent numbers from appearing at the end of lines -->
<!--<xsl:text disable-output-escaping="yes">&nbsp;</xsl:text>-->
</span>
</xsl:template>
<!--
The order of the next two matters: "begin-chapter=" takes precedence
over "class=woc" when both are present
-->
<!-- Words of Christ verse numbers -->
<!--
<xsl:template match="verse-num[@class='woc']">
<span class="verse-num-woc">
<xsl:apply-templates/>
<xsl:text disable-output-escaping="yes">&nbsp;</xsl:text>
</span>
</xsl:template>
-->
<!-- Chapter beginnings -->
<xsl:template match="verse-num[@begin-chapter]">
<!-- For better formatting of Psalms we omit the number here -->
<xsl:choose>
<xsl:when test="preceding-sibling::*[1][name()='begin-line']">
<span class="verse-num">1 </span>
</xsl:when>
<xsl:otherwise>
<span class="chapter-num"><xsl:value-of select="@begin-chapter"/></span>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- These translate directly to <span/> elements -->
<!--
<xsl:template match="selah|woc">
-->
<xsl:template match="selah">
<span class="{name()}"><xsl:apply-templates/></span>
</xsl:template>
<!-- Indentation -->
<xsl:template match="block-indent">
<div class="block-indent">
<xsl:apply-templates/>
</div>
</xsl:template>
<!-- WIDs -->
<xsl:template match="w">
<span class="word" wid="{@wid}">
<xsl:apply-templates/>
</span>
</xsl:template>
<!-- Any span element becomes small caps -->
<xsl:template match="span">
<span class="sc"><xsl:apply-templates/></span>
</xsl:template>
<!-- Some HTML elements may be present (see DTD). Copy them. -->
<xsl:template match="i|a|q">
<xsl:element name="{name()}"><xsl:apply-templates/></xsl:element>
</xsl:template>
<!--
Footnotes.
In the body we format a reference to the footnote list generated
later. We set the title attribute: with some browsers hovering
over the footnot reference will pop-up the footnote text.
-->
<xsl:template match="footnote">
<xsl:variable name="number" select="count(preceding::footnote)+1"/>
<a class="footnote" title="{.}" href="#fn{$number}">
<xsl:number value="$number" format="[1]"/>
</a>
</xsl:template>
<!-- The copyright notice -->
<xsl:template match="copyright">
<p><xsl:apply-templates/></p>
</xsl:template>
<!-- =============================================================== -->
<!-- The footnote section ========================================== -->
<!--
Make a list of the footnotes with suitable anchors. It might be
useful to generate backlinks into the text sometime.
-->
<xsl:template match="footnote" mode="footnotes">
<li>
<!-- <xsl:variable name="number" select="count(preceding::footnote)+1"/> -->
<xsl:variable name="number" select="position()"/>
<a id="fn{$number}" name="fn{$number}">
<xsl:number value="$number" format="[1]"/>
</a>
<xsl:text> </xsl:text>
<xsl:apply-templates/>
</li>
</xsl:template>
<!-- =============================================================== -->
<!-- Named templates =============================================== -->
<!--
Copy all the attributes of an element.
-->
<xsl:template name="copy-attributes">
<xsl:for-each select="@*">
<xsl:copy/>
</xsl:for-each>
</xsl:template>
<!-- =============================================================== -->
</xsl:stylesheet>