<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:clng="http://ums.isas.jaxa.jp/0.4/clng">
  <xsl:output method="text"/>
  <xsl:template match="/">
    <xsl:for-each select=".//clng:value-of">
      <xsl:apply-templates select="."/>
    </xsl:for-each>
  </xsl:template>

  <!--
  変数変換テーブル の設計ノート
                                                                  20050523 -KM-



  以下のような XSL を mapping 定義から作成し、final XSL に取り込む。

  つまり、mapping 定義の
  - value-of 要素の値の部分のみをとりだす (この例では s.i, s.s.c, s.s.i, i, i の 5 個)
  - 重複するものは取り除く (i は２回登場するのではじめの１個以外は無視)

  現在の clng:value-of template に対して variable langtype を定義するための
  choose 要素部分を付加したものを生成する。
  ( 現状の固定的な template は以下の生成に取り込まれるため、不要となる)

  - '.' での区切られ方 (0 回, 1回, 2回以上) に応じ
  - value-of-x.y.z 及び @name='xx'  の 'xx' の部分をしかるべき文字に置き換えた
  value-of-x.y.z template を生成する。

  これら一連の処理は XSL のみではむりなので、しかるべきところは、JAVA
  を使うとよいだろう。現状にくらべ、どこを最低限入れ替えれば良いかは要調査。

   langtype を子要素 (コンテナ、サブコンテナ) のテンプレートに引き渡す
   こととなった。これ以外のすべてのコンテナの apply-template および
      template でも、あらたに langtype パラメータを引き渡す必要がある。
  value-of要素の子になるまでは langtype パラメータは正しい値がつまらない。

  "x.y.z" といった表記の中に空白を入れると処理ができないので ums を書く側で注意。
  -->

  <xsl:template match="clng:value-of">
    <xsl:variable name="langtype">
      <xsl:choose>
        <xsl:when test="@select='s.i'">
          <xsl:call-template name="value-of-s.i"/>
        </xsl:when>
        <xsl:when test="@select='s.s.c'">
          <xsl:call-template name="value-of-s.s.c"/>
        </xsl:when>
        <xsl:when test="@select='s.s.i'">
          <xsl:call-template name="value-of-s.s.i"/>
        </xsl:when>
        <xsl:when test="@select='i'">
          <xsl:call-template name="value-of-i"/>
        </xsl:when>
      <xsl:otherwise>
#0#Type of '<xsl:value-of select="@select"/>' cannot resolved (remove space if exist).#0#
      </xsl:otherwise>
      </xsl:choose>
    </xsl:variable>
    <xsl:value-of select="$langtype"/>
  </xsl:template>

  <xsl:template name="value-of-s.i">
    <xsl:variable name="v1" select="ancestor::*[./defineVariables//clng:var/@name = 's'][1]//defineVariables//clng:var[@name = 's']/@struct"/>
#1#<xsl:value-of select="//struct[@name = $v1]//clng:var[@name= 'i']/@type"/>
    <xsl:if test="//struct[@name = $v1]/clng:array/clng:var[@name= 'i']/@type"> *</xsl:if>#1</xsl:template>

  <xsl:template name="value-of-s.s.c">
    <xsl:variable name="v1" select="ancestor::*[./defineVariables//clng:var/@name = 's'][1]//defineVariables//clng:var[@name = 's']/@struct"/>
    <xsl:for-each select="//struct[@name = $v1] ">
      <xsl:variable name="v2" select=".//clng:var[@name = 's']/@struct"/>
#2#<xsl:value-of select="//struct[@name = $v2]//clng:var[@name= 'c']/@type"/>
      <xsl:if test="//struct[@name = $v2]/clng:array/clng:var[@name= 'c']/@type"> *</xsl:if>#2</xsl:for-each>
  </xsl:template>

  <xsl:template name="value-of-s.s.i">
    <xsl:variable name="v1" select="ancestor::*[./defineVariables//clng:var/@name = 's'][1]//defineVariables//clng:var[@name = 's']/@struct"/>
    <xsl:for-each select="//struct[@name = $v1] ">
      <xsl:variable name="v2" select=".//clng:var[@name = 's']/@struct"/>
#3#<xsl:value-of select="//struct[@name = $v2]//clng:var[@name= 'i']/@type"/>
      <xsl:if test="//struct[@name = $v2]/clng:array/clng:var[@name= 'i']/@type"> *</xsl:if>#3</xsl:for-each>
  </xsl:template>

  <xsl:template name="value-of-i">
#4#<xsl:value-of select="ancestor::*[./defineVariables//clng:var/@name = 'i'][1]//defineVariables//clng:var[@name = 'i']/@type"/>
    <xsl:if test="ancestor::*[./defineVariables/clng:array/clng:var/@name = 'i'][1]//defineVariables//clng:var[@name = 'i']/@type"> *</xsl:if>#4</xsl:template>

</xsl:stylesheet>
