<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!--
(c) 2004 Eric Kemp-Benedict
This stylesheet extracts the qualitative information from a ScenML document and formats
it in Dashboard of Sustainability format.
NOTE: The stylesheet is limited to a maximum of 26 themes.
You may use this stylesheet and modify it. The author is not liable for any damages
that might be caused by the use of this stylesheet.
-->
<xsl:output method="text" indent="no"/>
<xsl:strip-space elements="*"/>
<!-- Global variables -->
<xsl:variable name="newline">
<xsl:text>
</xsl:text>
</xsl:variable>
<xsl:variable name="tab">
<xsl:text> </xsl:text>
</xsl:variable>
<xsl:template name="indicByTheme">
<xsl:param name="theme"/>
<xsl:if test="/ScenMLdoc/indicators/indicator[@theme=$theme]">
<xsl:value-of select="$theme"/>
<xsl:for-each select="/ScenMLdoc/indicators/indicator[@theme=$theme]">
<xsl:value-of select="$tab"/>
</xsl:for-each>
</xsl:if>
</xsl:template>
<xsl:template name="indicByCode">
<xsl:param name="theme"/>
<xsl:if test="/ScenMLdoc/indicators/indicator[@theme=$theme]">
<xsl:variable name="code"><xsl:call-template name="mapTheme"><xsl:with-param name="theme"><xsl:value-of select="$theme"/></xsl:with-param></xsl:call-template></xsl:variable>
<xsl:for-each select="/ScenMLdoc/indicators/indicator[@theme=$theme]">
<xsl:value-of select="$code"/><xsl:value-of select="position() - 1"/><xsl:value-of select="$tab"/>
</xsl:for-each>
</xsl:if>
</xsl:template>
<xsl:template name="indicByRule">
<xsl:param name="theme"/>
<xsl:if test="/ScenMLdoc/indicators/indicator[@theme=$theme]">
<xsl:for-each select="/ScenMLdoc/indicators/indicator[@theme=$theme]">
<xsl:choose>
<xsl:when test="@minmax='max'"><xsl:text>max </xsl:text></xsl:when>
<xsl:when test="@minmax='min'"><xsl:text>min </xsl:text></xsl:when>
</xsl:choose>
</xsl:for-each>
</xsl:if>
</xsl:template>
<xsl:template name="indicByWeight">
<xsl:param name="theme"/>
<xsl:if test="/ScenMLdoc/indicators/indicator[@theme=$theme]">
<xsl:for-each select="/ScenMLdoc/indicators/indicator[@theme=$theme]">
<xsl:value-of select="@weight"/><xsl:value-of select="$tab"/>
</xsl:for-each>
</xsl:if>
</xsl:template>
<xsl:template name="indicByShortname">
<xsl:param name="theme"/>
<xsl:if test="/ScenMLdoc/indicators/indicator[@theme=$theme]">
<xsl:for-each select="/ScenMLdoc/indicators/indicator[@theme=$theme]">
<xsl:value-of select="@shortname"/><xsl:value-of select="$tab"/>
</xsl:for-each>
</xsl:if>
</xsl:template>
<xsl:template name="indicByLongname">
<xsl:param name="theme"/>
<xsl:if test="/ScenMLdoc/indicators/indicator[@theme=$theme]">
<xsl:for-each select="/ScenMLdoc/indicators/indicator[@theme=$theme]">
<xsl:value-of select="./name"/><xsl:value-of select="$tab"/>
</xsl:for-each>
</xsl:if>
</xsl:template>
<xsl:template name="indicByUnit">
<xsl:param name="theme"/>
<xsl:if test="/ScenMLdoc/indicators/indicator[@theme=$theme]">
<xsl:for-each select="/ScenMLdoc/indicators/indicator[@theme=$theme]">
<xsl:value-of select="@units"/><xsl:value-of select="$tab"/>
</xsl:for-each>
</xsl:if>
</xsl:template>
<xsl:template name="indicValues">
<xsl:param name="theme"/>
<xsl:param name="region"/>
<xsl:param name="year"/>
<xsl:param name="scenario"/>
<xsl:if test="/ScenMLdoc/indicators/indicator[@theme=$theme]">
<xsl:for-each select="/ScenMLdoc/indicators/indicator[@theme=$theme]">
<xsl:value-of select="./value[@region=$region and @year=$year and @scenario=$scenario]"/><xsl:value-of select="$tab"/>
</xsl:for-each>
</xsl:if>
</xsl:template>
<xsl:template name="generateIndics">
<xsl:param name="year"/>
<xsl:for-each select="/ScenMLdoc/items/region">
<xsl:variable name="regionNdx" select="@name"/>
<xsl:for-each select="/ScenMLdoc/items/scenario">
<xsl:variable name="scenNdx" select="@name"/>
<xsl:value-of select="$year"/><xsl:value-of select="$tab"/>
<xsl:value-of select="$regionNdx"/><xsl:text>, </xsl:text><xsl:value-of select="$scenNdx"/><xsl:value-of select="$tab"/>
<xsl:for-each select="/ScenMLdoc/items/theme">
<xsl:variable name="themeName" select="@name"/>
<xsl:call-template name="indicValues">
<xsl:with-param name="theme"><xsl:value-of select="$themeName"/></xsl:with-param>
<xsl:with-param name="region"><xsl:value-of select="$regionNdx"/></xsl:with-param>
<xsl:with-param name="scenario"><xsl:value-of select="$scenNdx"/></xsl:with-param>
<xsl:with-param name="year"><xsl:value-of select="$year"/></xsl:with-param>
</xsl:call-template>
</xsl:for-each>
<xsl:value-of select="$newline"/>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
<!-- Mapping theme names to letter codes -->
<xsl:template name="mapTheme">
<xsl:param name="theme"/>
<!-- Only return a value if there are indicators with this theme -->
<xsl:if test="/ScenMLdoc/indicators/indicator[@theme=$theme]">
<xsl:for-each select="/ScenMLdoc/items/theme">
<xsl:if test="$theme=@name"><xsl:call-template name="num2letter"><xsl:with-param name="index"><xsl:value-of select="position()"/></xsl:with-param></xsl:call-template></xsl:if>
</xsl:for-each>
</xsl:if>
</xsl:template>
<xsl:template name="num2letter">
<xsl:param name="index"/>
<xsl:choose>
<xsl:when test="$index=1">A</xsl:when>
<xsl:when test="$index=2">B</xsl:when>
<xsl:when test="$index=3">C</xsl:when>
<xsl:when test="$index=4">D</xsl:when>
<xsl:when test="$index=5">E</xsl:when>
<xsl:when test="$index=6">F</xsl:when>
<xsl:when test="$index=7">G</xsl:when>
<xsl:when test="$index=8">H</xsl:when>
<xsl:when test="$index=9">I</xsl:when>
<xsl:when test="$index=10">J</xsl:when>
<xsl:when test="$index=11">K</xsl:when>
<xsl:when test="$index=12">L</xsl:when>
<xsl:when test="$index=13">M</xsl:when>
<xsl:when test="$index=14">N</xsl:when>
<xsl:when test="$index=15">O</xsl:when>
<xsl:when test="$index=16">P</xsl:when>
<xsl:when test="$index=17">Q</xsl:when>
<xsl:when test="$index=18">R</xsl:when>
<xsl:when test="$index=19">S</xsl:when>
<xsl:when test="$index=20">T</xsl:when>
<xsl:when test="$index=21">U</xsl:when>
<xsl:when test="$index=22">V</xsl:when>
<xsl:when test="$index=23">W</xsl:when>
<xsl:when test="$index=24">X</xsl:when>
<xsl:when test="$index=25">Y</xsl:when>
<xsl:when test="$index=26">Z</xsl:when>
</xsl:choose>
</xsl:template>
<!-- **************************
The document itself
************************** -->
<xsl:template match="ScenMLdoc">
<!-- Header -->
<!-- First line -->
<xsl:text> PARAS: Name=<</xsl:text>
<xsl:value-of select="@name"/>
<xsl:text>>, Codes=<</xsl:text>
<xsl:for-each select="/ScenMLdoc/items/theme">
<xsl:call-template name="mapTheme">
<xsl:with-param name="theme">
<xsl:value-of select="@name"/>
</xsl:with-param>
</xsl:call-template>
</xsl:for-each>
<xsl:text>> NoMess</xsl:text>
<xsl:value-of select="$newline"/>
<!-- List of indicators -->
<!-- First, list theme names -->
<xsl:text> MAIN_THEME </xsl:text>
<xsl:for-each select="/ScenMLdoc/items/theme">
<xsl:call-template name="indicByTheme"><xsl:with-param name="theme"><xsl:value-of select="@name"/></xsl:with-param></xsl:call-template>
</xsl:for-each>
<xsl:value-of select="$newline"/>
<!-- Next, list indicator codes -->
<xsl:text>YEAR IND_NO </xsl:text>
<xsl:for-each select="/ScenMLdoc/items/theme">
<xsl:call-template name="indicByCode"><xsl:with-param name="theme"><xsl:value-of select="@name"/></xsl:with-param></xsl:call-template>
</xsl:for-each>
<xsl:value-of select="$newline"/>
<!-- Blank source line (MODIFY THIS IF "SOURCE" IS ADDED TO SCENML) -->
<xsl:text> IND_SOURCE</xsl:text>
<xsl:value-of select="$newline"/>
<!-- Good/Bad rule line -->
<xsl:text> GB_RULE </xsl:text>
<xsl:for-each select="/ScenMLdoc/items/theme">
<xsl:call-template name="indicByRule"><xsl:with-param name="theme"><xsl:value-of select="@name"/></xsl:with-param></xsl:call-template>
</xsl:for-each>
<xsl:value-of select="$newline"/>
<!-- Weight line -->
<xsl:text> WEIGHT </xsl:text>
<xsl:for-each select="/ScenMLdoc/items/theme">
<xsl:call-template name="indicByWeight"><xsl:with-param name="theme"><xsl:value-of select="@name"/></xsl:with-param></xsl:call-template>
</xsl:for-each>
<xsl:value-of select="$newline"/>
<!-- Shortname line -->
<xsl:text> SHORT_NAME </xsl:text>
<xsl:for-each select="/ScenMLdoc/items/theme">
<xsl:call-template name="indicByShortname"><xsl:with-param name="theme"><xsl:value-of select="@name"/></xsl:with-param></xsl:call-template>
</xsl:for-each>
<xsl:value-of select="$newline"/>
<!-- Longname line -->
<xsl:text> IND_NAME </xsl:text>
<xsl:for-each select="/ScenMLdoc/items/theme">
<xsl:call-template name="indicByLongname"><xsl:with-param name="theme"><xsl:value-of select="@name"/></xsl:with-param></xsl:call-template>
</xsl:for-each>
<xsl:value-of select="$newline"/>
<!-- Unit line -->
<xsl:text> IND_UNIT </xsl:text>
<xsl:for-each select="/ScenMLdoc/items/theme">
<xsl:call-template name="indicByUnit"><xsl:with-param name="theme"><xsl:value-of select="@name"/></xsl:with-param></xsl:call-template>
</xsl:for-each>
<xsl:value-of select="$newline"/>
<!-- Base Year Values -->
<xsl:call-template name="generateIndics">
<xsl:with-param name="year"><xsl:value-of select="/ScenMLdoc/years/baseyr/@val"/></xsl:with-param>
</xsl:call-template>
<!-- Scenario Values -->
<xsl:for-each select="/ScenMLdoc/years/scenyr">
<xsl:call-template name="generateIndics">
<xsl:with-param name="year"><xsl:value-of select="@val"/></xsl:with-param>
</xsl:call-template>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>