<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!-- xsl:output method="html"/ -->
  <xsl:key name="keyRouteGrade" match="route" use="routeGrade" />
  <xsl:key name="keyRouteGradeAndSubGrade" match="route" use="concat(routeGrade,routeSubGrade)" />
  <xsl:key name="keyRouteType" match="route" use="routeType" />

  <xsl:template match="/">
    <ul class="mktree" id="tree1">
      <xsl:call-template name="GetInfoByArea" />
      <xsl:call-template name="GetInfoByGrade" />
      <xsl:call-template name="GetInfoByType" />
    </ul>
  </xsl:template>

  <xsl:template name="GetInfoByArea">
    <li class="liClosed" id="routesByArea">
      Routes By Area
      <ul class="liClosed" id="treeByArea">
        <xsl:for-each select="routes/area">
          <xsl:sort select="areaTitle" order="ascending"/>
          <xsl:element name="li">
            <xsl:attribute name="class">liClosed</xsl:attribute>
            <xsl:attribute name="id"><xsl:value-of select="areaId" /></xsl:attribute>
            <xsl:value-of select="areaTitle" />
            <ul>
              <xsl:for-each select="wall">
                <xsl:sort select="wallTitle" order="ascending"/>
                <xsl:choose>
                  <xsl:when test="wallId = 'NA'">
                    <xsl:for-each select="route">
                      <xsl:call-template name="GetAreaRouteInfo" />
                    </xsl:for-each>
                  </xsl:when>
                  <xsl:otherwise>
                    <xsl:element name="li">
                      <xsl:call-template name="GetListItemWallInfo" />
                      <ul>
                        <xsl:for-each select="route">
                          <xsl:sort select="routeName" order="ascending"/>
                          <xsl:call-template name="GetAreaRouteInfo" />
                        </xsl:for-each>
                      </ul>
                    </xsl:element>
                  </xsl:otherwise>
                </xsl:choose>

              </xsl:for-each>
            </ul>
          </xsl:element>
        </xsl:for-each>
      </ul>
    </li>
    <!-- /ul -->
  </xsl:template>

  <xsl:template name="GetInfoByGrade" match="routes/area/wall">
    <li class="liClosed" id="routesByGrade">
      Routes By Grade
      <ul class="liClosed" id="treeByGrade">

        <xsl:for-each select="//route[generate-id(.)=generate-id(key('keyRouteGrade',routeGrade)[1])]">
          <xsl:sort select="routeGrade" order="ascending" data-type="number"  />
          <xsl:variable name="tempRouteGrade">
            <xsl:value-of select="routeGrade" />
          </xsl:variable>
          <xsl:variable name="tempRoute1" select="//route[routeGrade=$tempRouteGrade]" />

          <xsl:if test="number($tempRoute1[routeGrade=$tempRouteGrade]/routeGrade) &lt; 10">
            <xsl:element name="li">
              <xsl:attribute name="class">liClosed</xsl:attribute>
              <xsl:attribute name="id">grade<xsl:value-of select="$tempRoute1[routeGrade=$tempRouteGrade]/routeGrade" /></xsl:attribute>
              5.<xsl:value-of select="$tempRoute1[routeGrade=$tempRouteGrade]/routeGrade" />
              <ul>
                <xsl:for-each select="$tempRoute1[routeGrade=$tempRouteGrade]/.">
                  <xsl:sort select="routeName" order="ascending" />
                  <xsl:call-template name="GetGradeRouteInfo" />
                </xsl:for-each>
              </ul>
            </xsl:element>
          </xsl:if>

          <xsl:if test="number($tempRoute1[routeGrade=$tempRouteGrade]/routeGrade) &gt; 9">
            <xsl:element name="li">
              <xsl:attribute name="class">liClosed</xsl:attribute>
              <xsl:attribute name="id">grade<xsl:value-of select="$tempRoute1[routeGrade=$tempRouteGrade]/routeGrade" /></xsl:attribute>
              5.<xsl:value-of select="$tempRoute1[routeGrade=$tempRouteGrade]/routeGrade" />
              <ul>
                <xsl:for-each select="//route[generate-id(.)=generate-id(key('keyRouteGradeAndSubGrade',concat(routeGrade,routeSubGrade))[1])]">

                    <xsl:sort select="routeGrade" order="ascending" data-type="number"  />
                  <xsl:sort select="routeSubGrade" order="ascending"  />
                  <xsl:variable name="tempRouteGradeAndSubGrade"><xsl:value-of select="concat(routeGrade,routeSubGrade)" />
                  </xsl:variable>

                  <xsl:variable name="tempRoute2" select="//route[concat(routeGrade,routeSubGrade)=$tempRouteGradeAndSubGrade]" />

                  <xsl:if test="$tempRoute2[concat(routeGrade,routeSubGrade)=$tempRouteGradeAndSubGrade]/routeGrade=$tempRoute1[routeGrade=$tempRouteGrade]/routeGrade">

                    <xsl:element name="li">
                      <xsl:attribute name="class">liClosed</xsl:attribute>
                      <xsl:attribute name="id">grade<xsl:value-of select="$tempRoute2[concat(routeGrade,routeSubGrade)=$tempRouteGradeAndSubGrade]/routeGrade" /></xsl:attribute>
                      5.<xsl:value-of select="$tempRoute2[concat(routeGrade,routeSubGrade)=$tempRouteGradeAndSubGrade]/routeGrade" /><xsl:value-of select="$tempRoute2[concat(routeGrade,routeSubGrade)=$tempRouteGradeAndSubGrade]/routeSubGrade" />
                      <ul>
                        <xsl:for-each select="$tempRoute2[concat(routeGrade,routeSubGrade)=$tempRouteGradeAndSubGrade]/.">
                          <xsl:sort select="routeName" order="ascending" />
                          <xsl:call-template name="GetGradeRouteInfo" />
                        </xsl:for-each>
                      </ul>
                    </xsl:element>
                  </xsl:if>
                </xsl:for-each>
              </ul>
            </xsl:element>
          </xsl:if>

        </xsl:for-each>

      </ul>
    </li>
    <!--/ul -->
  </xsl:template>

  <xsl:template name="GetInfoByType" match="routes/area/wall">
    <li class="liClosed" id="routesByType">
      Routes By Type
      <ul class="liClosed" id="treeByType">
        <li class="liClosed" id="TradRoutes">
          Gear Routes
          <ul class="liClosed" id="RoutesOfTrad">
            <xsl:element name="li">
              <xsl:attribute name="class">liClosed</xsl:attribute>
              <xsl:attribute name="id">TradA2G</xsl:attribute>
              A - G
              <ul class="liClosed" id="A2G">
                <xsl:for-each select="//route/.">
                  <xsl:sort select="routeName" order="ascending" />
                  <xsl:variable name="myI1" select="substring(routeName,1,1)" />
                  <xsl:if test="$myI1 = 'A' or $myI1 = 'B' or $myI1 = 'C' or $myI1 = 'D' or $myI1 = 'E' or $myI1 = 'F' or $myI1 = 'G'">

                    <xsl:if test="routeType = 'trad'">
                      <xsl:call-template name="GetTradRouteInfo" />
                    </xsl:if>
                  </xsl:if>
                </xsl:for-each>
              </ul>
            </xsl:element>
            <xsl:element name="li">
              <xsl:attribute name="class">liClosed</xsl:attribute>
              <xsl:attribute name="id">TradH2M</xsl:attribute>
              H - M
              <ul class="liClosed" id="H2M">
                <xsl:for-each select="//route/.">
                  <xsl:sort select="routeName" order="ascending" />
                  <xsl:variable name="myI2" select="substring(routeName,1,1)" />
                  <xsl:if test="$myI2 = 'H' or $myI2 = 'I' or $myI2 = 'J' or $myI2 = 'K' or $myI2 = 'L' or $myI2 = 'M'">

                    <xsl:if test="routeType = 'trad'">
                      <xsl:call-template name="GetTradRouteInfo" />
                    </xsl:if>
                  </xsl:if>
                </xsl:for-each>
              </ul>
            </xsl:element>
            <xsl:element name="li">
              <xsl:attribute name="class">liClosed</xsl:attribute>
              <xsl:attribute name="id">TradN2S</xsl:attribute>
              N - S
              <ul class="liClosed" id="N2S">
                <xsl:for-each select="//route/.">
                  <xsl:sort select="routeName" order="ascending" />
                  <xsl:variable name="myI3" select="substring(routeName,1,1)" />
                  <xsl:if test="$myI3 = 'N' or $myI3 = 'O' or $myI3 = 'P' or $myI3 = 'Q' or $myI3 = 'R' or $myI3 = 'S'">

                    <xsl:if test="routeType = 'trad'">
                      <xsl:call-template name="GetTradRouteInfo" />
                    </xsl:if>
                  </xsl:if>
                </xsl:for-each>
              </ul>
            </xsl:element>
            <xsl:element name="li">
              <xsl:attribute name="class">liClosed</xsl:attribute>
              <xsl:attribute name="id">TradT2Z</xsl:attribute>
              T - Z
              <ul class="liClosed" id="T2Z">
                <xsl:for-each select="//route/.">
                  <xsl:sort select="routeName" order="ascending" />
                  <xsl:variable name="myI4" select="substring(routeName,1,1)" />
                  <xsl:if test="$myI4 = 'T' or $myI4 = 'U' or $myI4 = 'V' or $myI4 = 'W' or $myI4 = 'X' or $myI4 = 'Y' or $myI4 = 'Z'">

                    <xsl:if test="routeType = 'trad'">
                      <xsl:call-template name="GetTradRouteInfo" />
                    </xsl:if>
                  </xsl:if>
                </xsl:for-each>
              </ul>
            </xsl:element>
          </ul>
        </li>
      </ul>
    </li>
  </xsl:template>

  <xsl:template name="GetListItemWallInfo">
    <xsl:attribute name="class">liClosed</xsl:attribute>
    <xsl:attribute name="id">
      <xsl:value-of select="wallId" />
    </xsl:attribute>
    <!-- xsl:variable name="wallHover" select="wallHover"/>
                <xsl:if test="$wallHover = 'yes'"></xsl:if -->
    <xsl:value-of select="wallTitle" />
  </xsl:template>

  <xsl:template name="GetAreaRouteInfo">
    <xsl:element name="li">
      <xsl:attribute name="id">a<xsl:value-of select="*/preceding-sibling::*" /></xsl:attribute>
      <xsl:element name="a">
        <xsl:attribute name="href">#</xsl:attribute>
        <xsl:attribute name="id">a<xsl:value-of select="*/preceding-sibling::*" />_<xsl:value-of select="jsonIndex" /></xsl:attribute>
        <!-- a<xsl:value-of select="routeId" />_<xsl:value-of select="jsonIndex" /> -->
        <xsl:value-of select="routeName" /> (.<xsl:value-of select="routeGrade" /><xsl:value-of select="routeSubGrade" />)
      </xsl:element>
    </xsl:element>
  </xsl:template>

  <xsl:template name="GetGradeRouteInfo">
    <xsl:element name="li">
      <xsl:attribute name="id">b<xsl:value-of select="*/preceding-sibling::*" /></xsl:attribute>
      <xsl:element name="a">
        <xsl:attribute name="href">#</xsl:attribute>
        <xsl:attribute name="id">b<xsl:value-of select="*/preceding-sibling::*" />_<xsl:value-of select="jsonIndex" /></xsl:attribute>
          <!-- b<xsl:value-of select="routeId" />_<xsl:value-of select="jsonIndex" / -->
        <xsl:value-of select="routeName" />
      </xsl:element>
    </xsl:element>
  </xsl:template>

  <xsl:template name="GetTradRouteInfo">
    <xsl:element name="li">
      <xsl:attribute name="id">c<xsl:value-of select="*/preceding-sibling::*" /></xsl:attribute>
      <xsl:element name="a">
        <xsl:attribute name="href">#</xsl:attribute>
        <xsl:attribute name="id">c<xsl:value-of select="*/preceding-sibling::*" />_<xsl:value-of select="jsonIndex" /></xsl:attribute>
          <!-- c<xsl:value-of select="routeId" />_<xsl:value-of select="jsonIndex" / -->
        <xsl:value-of select="routeName" /> (.<xsl:value-of select="routeGrade" /><xsl:value-of select="routeSubGrade" />)
      </xsl:element>
    </xsl:element>
  </xsl:template>

</xsl:stylesheet>

