You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
308 lines
9.7 KiB
308 lines
9.7 KiB
15 years ago
|
<?xml version="1.0"?>
|
||
|
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
||
|
xmlns:tc="http://periapsis.org/tellico/"
|
||
|
exclude-result-prefixes="tc"
|
||
|
version="1.0">
|
||
|
|
||
|
<!--
|
||
|
===================================================================
|
||
|
Tellico XSLT file - some common templates.
|
||
|
|
||
|
Copyright (C) 2004-2006 Robby Stephenson - robby@periapsis.org
|
||
|
|
||
|
This XSLT stylesheet is designed to be used with the 'Tellico'
|
||
|
application, which can be found at http://www.periapsis.org/tellico/
|
||
|
===================================================================
|
||
|
-->
|
||
|
|
||
|
<xsl:output method="html"
|
||
|
indent="yes"
|
||
|
doctype-public="-//W3C//DTD HTML 4.01//EN"
|
||
|
doctype-system="http://www.w3.org/TR/html4/strict.dtd"
|
||
|
encoding="utf-8"/>
|
||
|
|
||
|
<!-- Template for checking syntax version -->
|
||
|
<xsl:template name="syntax-version">
|
||
|
<xsl:param name="this-version"/>
|
||
|
<xsl:param name="data-version"/>
|
||
|
<xsl:if test="$data-version > $this-version">
|
||
|
<xsl:message>
|
||
|
<xsl:text>This stylesheet was designed for Tellico DTD version </xsl:text>
|
||
|
<xsl:value-of select="$this-version"/>
|
||
|
<xsl:text> or earlier, 
but the input data file is version </xsl:text>
|
||
|
<xsl:value-of select="$data-version"/>
|
||
|
<xsl:text>. There might be some 
problems with the output.</xsl:text>
|
||
|
</xsl:message>
|
||
|
</xsl:if>
|
||
|
</xsl:template>
|
||
|
|
||
|
<!-- template for creating attributes to scale an image to a max boundary size -->
|
||
|
<xsl:template name="image-size">
|
||
|
<xsl:param name="limit-height" select="'0'"/>
|
||
|
<xsl:param name="limit-width" select="'0'"/>
|
||
|
<xsl:param name="image"/>
|
||
|
|
||
|
<xsl:variable name="actual-width" select="$image/@width"/>
|
||
|
<xsl:variable name="actual-height" select="$image/@height"/>
|
||
|
|
||
|
<xsl:choose>
|
||
|
<xsl:when test="$limit-width > 0 and $limit-height > 0 and
|
||
|
($actual-width > $limit-width or $actual-height > $limit-height)">
|
||
|
|
||
|
<xsl:choose>
|
||
|
|
||
|
<xsl:when test="$actual-width * $limit-height < $actual-height * $limit-width">
|
||
|
<xsl:attribute name="height">
|
||
|
<xsl:value-of select="round($limit-height)"/>
|
||
|
</xsl:attribute>
|
||
|
<xsl:attribute name="width">
|
||
|
<xsl:value-of select="round($actual-width * $limit-height div $actual-height)"/>
|
||
|
</xsl:attribute>
|
||
|
</xsl:when>
|
||
|
|
||
|
<xsl:otherwise>
|
||
|
<xsl:attribute name="width">
|
||
|
<xsl:value-of select="round($limit-width)"/>
|
||
|
</xsl:attribute>
|
||
|
<xsl:attribute name="height">
|
||
|
<xsl:value-of select="round($actual-height * $limit-width div $actual-width)"/>
|
||
|
</xsl:attribute>
|
||
|
</xsl:otherwise>
|
||
|
|
||
|
</xsl:choose>
|
||
|
|
||
|
</xsl:when>
|
||
|
|
||
|
<!-- if both are smaller, no change -->
|
||
|
<xsl:when test="$actual-width > 0 and $actual-height > 0">
|
||
|
<xsl:attribute name="width">
|
||
|
<xsl:value-of select="$actual-width"/>
|
||
|
</xsl:attribute>
|
||
|
<xsl:attribute name="height">
|
||
|
<xsl:value-of select="$actual-height"/>
|
||
|
</xsl:attribute>
|
||
|
</xsl:when>
|
||
|
|
||
|
</xsl:choose>
|
||
|
</xsl:template>
|
||
|
|
||
|
<!-- template for outputing most value types -->
|
||
|
<xsl:template name="simple-field-value">
|
||
|
<xsl:param name="entry"/>
|
||
|
<xsl:param name="field"/>
|
||
|
|
||
|
<!-- if the field has multiple values, then there is
|
||
|
no child of the entry with the field name -->
|
||
|
<xsl:variable name="child" select="$entry/*[local-name(.)=$field]"/>
|
||
|
<xsl:choose>
|
||
|
<xsl:when test="$child">
|
||
|
<xsl:variable name="f" select="$entry/../tc:fields/tc:field[@name = $field]"/>
|
||
|
|
||
|
<!-- if the field is a bool type, just ouput an X, or use data image -->
|
||
|
<xsl:choose>
|
||
|
<!-- paragraphs need to have output escaping disabled so HTML works -->
|
||
|
<xsl:when test="$f/@type=2">
|
||
|
<xsl:value-of select="$child" disable-output-escaping="yes"/>
|
||
|
</xsl:when>
|
||
|
|
||
|
<xsl:when test="$f/@type=4">
|
||
|
<img height="14" alt="✓">
|
||
|
<xsl:attribute name="src">
|
||
|
<xsl:value-of select="concat($datadir,'pics/checkmark.png')"/>
|
||
|
</xsl:attribute>
|
||
|
</img>
|
||
|
</xsl:when>
|
||
|
|
||
|
<!-- if it's a url, then add a hyperlink -->
|
||
|
<xsl:when test="$f/@type=7">
|
||
|
<a href="{$child}">
|
||
|
<!-- The Amazon Web Services license requires the link -->
|
||
|
<xsl:choose>
|
||
|
<xsl:when test="$field = 'amazon'">
|
||
|
<xsl:text>Buy from Amazon.com</xsl:text>
|
||
|
</xsl:when>
|
||
|
<xsl:otherwise>
|
||
|
<xsl:value-of select="$child"/>
|
||
|
</xsl:otherwise>
|
||
|
</xsl:choose>
|
||
|
</a>
|
||
|
</xsl:when>
|
||
|
|
||
|
<!-- if it's a date, format with hyphens -->
|
||
|
<xsl:when test="$f/@type=12">
|
||
|
<xsl:value-of select="$child/tc:year"/>
|
||
|
<xsl:text>-</xsl:text>
|
||
|
<xsl:value-of select="format-number($child/tc:month,'00')"/>
|
||
|
<xsl:text>-</xsl:text>
|
||
|
<xsl:value-of select="format-number($child/tc:day,'00')"/>
|
||
|
</xsl:when>
|
||
|
|
||
|
<!-- special case for rating -->
|
||
|
<xsl:when test="$f/@type=14">
|
||
|
<!-- get the number, could be 10, so can't just grab first digit -->
|
||
|
<xsl:variable name="n">
|
||
|
<xsl:choose>
|
||
|
<xsl:when test="number(substring($child,1,1))">
|
||
|
<xsl:choose>
|
||
|
<xsl:when test="number(substring($child,1,2)) < 11">
|
||
|
<xsl:value-of select="number(substring($child,1,2))"/>
|
||
|
</xsl:when>
|
||
|
<xsl:otherwise>
|
||
|
<xsl:value-of select="number(substring($child,1,1))"/>
|
||
|
</xsl:otherwise>
|
||
|
</xsl:choose>
|
||
|
</xsl:when>
|
||
|
<xsl:otherwise>
|
||
|
<xsl:value-of select="false()"/>
|
||
|
</xsl:otherwise>
|
||
|
</xsl:choose>
|
||
|
</xsl:variable>
|
||
|
<xsl:if test="$n > 0">
|
||
|
<!-- the image is really 18 pixels high, but make it smaller to match default font -->
|
||
|
<img height="14">
|
||
|
<xsl:attribute name="src">
|
||
|
<xsl:value-of select="concat($datadir,'pics/stars',$n,'.png')"/>
|
||
|
</xsl:attribute>
|
||
|
<xsl:attribute name="alt">
|
||
|
<xsl:value-of select="concat($n,' stars')"/>
|
||
|
</xsl:attribute>
|
||
|
</img>
|
||
|
</xsl:if>
|
||
|
<xsl:if test="not($n)">
|
||
|
<xsl:value-of select="$child"/>
|
||
|
</xsl:if>
|
||
|
</xsl:when>
|
||
|
|
||
|
<xsl:otherwise>
|
||
|
<xsl:value-of select="$child"/>
|
||
|
<!-- hack for running-time in videos -->
|
||
|
<!--
|
||
|
<xsl:if test="$field='running-time' and key('fieldsByName',$field)/@type=6">
|
||
|
<xsl:text> minutes</xsl:text>
|
||
|
</xsl:if>
|
||
|
-->
|
||
|
</xsl:otherwise>
|
||
|
</xsl:choose>
|
||
|
</xsl:when>
|
||
|
|
||
|
<!-- now handle fields with multiple values -->
|
||
|
<xsl:otherwise>
|
||
|
<xsl:for-each select="$entry/*[local-name()=concat($field,'s')]/*">
|
||
|
<xsl:value-of select="."/>
|
||
|
<xsl:if test="position() != last()">
|
||
|
<xsl:text>; </xsl:text>
|
||
|
</xsl:if>
|
||
|
</xsl:for-each>
|
||
|
</xsl:otherwise>
|
||
|
</xsl:choose>
|
||
|
</xsl:template>
|
||
|
|
||
|
<xsl:template name="image-link">
|
||
|
<xsl:param name="image"/>
|
||
|
<xsl:param name="dir"/>
|
||
|
<xsl:variable name="id" select="$image/@id"/>
|
||
|
<xsl:choose>
|
||
|
<xsl:when test="$image/@link = 'true'">
|
||
|
<!-- the id _is_ the link -->
|
||
|
<xsl:value-of select="$id"/>
|
||
|
</xsl:when>
|
||
|
<xsl:when test="string-length($dir) > 0">
|
||
|
<xsl:value-of select="concat($dir, $id)"/>
|
||
|
</xsl:when>
|
||
|
<!-- otherwise try $imgdir and $datadir -->
|
||
|
<xsl:when test="string-length($datadir) > 0">
|
||
|
<xsl:value-of select="concat($datadir, $id)"/>
|
||
|
</xsl:when>
|
||
|
<xsl:otherwise>
|
||
|
<xsl:value-of select="concat($imgdir, $id)"/>
|
||
|
</xsl:otherwise>
|
||
|
</xsl:choose>
|
||
|
</xsl:template>
|
||
|
|
||
|
<xsl:template name="msqueeze">
|
||
|
<xsl:param name="str"/>
|
||
|
<xsl:param name="len"/>
|
||
|
|
||
|
<xsl:variable name="slen" select="string-length($str)"/>
|
||
|
<xsl:variable name="mid" select="floor($len div 2)"/>
|
||
|
|
||
|
<xsl:choose>
|
||
|
<xsl:when test="$slen > $len">
|
||
|
<xsl:value-of select="substring($str, 0, $mid - 2)"/>
|
||
|
<xsl:text>[...]</xsl:text>
|
||
|
<xsl:value-of select="substring($str, $slen - $mid + 3, $mid - 2)"/>
|
||
|
</xsl:when>
|
||
|
<xsl:otherwise>
|
||
|
<xsl:value-of select="$str"/>
|
||
|
</xsl:otherwise>
|
||
|
</xsl:choose>
|
||
|
</xsl:template>
|
||
|
|
||
|
<!-- sums all nodes, assuming they are in MM:SS format -->
|
||
|
<xsl:template name="sumTime">
|
||
|
<xsl:param name="nodes" select="/.."/>
|
||
|
<xsl:param name="totalMin" select="0"/>
|
||
|
<xsl:param name="totalSec" select="0"/>
|
||
|
|
||
|
<xsl:choose>
|
||
|
|
||
|
<xsl:when test="not($nodes)">
|
||
|
<xsl:value-of select="$totalMin + floor($totalSec div 60)"/>
|
||
|
<xsl:text>:</xsl:text>
|
||
|
<xsl:value-of select="format-number($totalSec mod 60, '00')"/>
|
||
|
</xsl:when>
|
||
|
|
||
|
<xsl:when test="string-length($nodes[1]) > 0">
|
||
|
<xsl:variable name="min">
|
||
|
<xsl:value-of select="substring-before($nodes[1], ':')"/>
|
||
|
</xsl:variable>
|
||
|
<xsl:variable name="sec">
|
||
|
<xsl:value-of select="substring-after($nodes[1], ':')"/>
|
||
|
</xsl:variable>
|
||
|
<xsl:call-template name="sumTime">
|
||
|
<xsl:with-param name="nodes" select="$nodes[position() != 1]"/>
|
||
|
<xsl:with-param name="totalMin" select="$totalMin + $min"/>
|
||
|
<xsl:with-param name="totalSec" select="$totalSec + $sec"/>
|
||
|
</xsl:call-template>
|
||
|
</xsl:when>
|
||
|
|
||
|
<xsl:otherwise>
|
||
|
<xsl:call-template name="sumTime">
|
||
|
<xsl:with-param name="nodes" select="$nodes[position() != 1]"/>
|
||
|
<xsl:with-param name="totalMin" select="$totalMin"/>
|
||
|
<xsl:with-param name="totalSec" select="$totalSec"/>
|
||
|
</xsl:call-template>
|
||
|
</xsl:otherwise>
|
||
|
|
||
|
</xsl:choose>
|
||
|
</xsl:template>
|
||
|
|
||
|
<xsl:template name="columnTitle">
|
||
|
<xsl:param name="index" select="1"/>
|
||
|
<xsl:param name="max" select="10"/>
|
||
|
<xsl:param name="elem" select="'th'"/>
|
||
|
<xsl:param name="style"/>
|
||
|
<xsl:param name="field" select="/.."/>
|
||
|
|
||
|
<xsl:if test="not($index > $max)">
|
||
|
<xsl:element name="{$elem}">
|
||
|
<xsl:if test="string-length($style)">
|
||
|
<xsl:attribute name="style">
|
||
|
<xsl:value-of select="$style"/>
|
||
|
</xsl:attribute>
|
||
|
</xsl:if>
|
||
|
<xsl:value-of select="$field/tc:prop[@name = concat('column', $index)]"/>
|
||
|
</xsl:element>
|
||
|
|
||
|
<xsl:call-template name="columnTitle">
|
||
|
<xsl:with-param name="index" select="$index + 1"/>
|
||
|
<xsl:with-param name="max" select="$max"/>
|
||
|
<xsl:with-param name="elem" select="$elem"/>
|
||
|
<xsl:with-param name="style" select="$style"/>
|
||
|
<xsl:with-param name="field" select="$field"/>
|
||
|
</xsl:call-template>
|
||
|
</xsl:if>
|
||
|
</xsl:template>
|
||
|
|
||
|
</xsl:stylesheet>
|