<?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>