下記のようなXMLがある時、
<data>
<a>1</a>
<b>2</b>
</data>
<data>
<a>3</a>
<b>4</b>
</data>
a * b の合計はどのように表記するのでしょうか。
http://www.atmarkit.co.jp/fxml/askxmlexpert/008calc/08calc.html
XML文書の中の数字で計算したい
<xsl:value-of select=”number(a)*number(b)”/>で求められます。
XMLではルートノードを複数持つことが出来ないので勝手に<hoge>をルートノードと仮定します
入力XML
<hoge>
<data>
<a>1</a>
<b>2</b>
</data>
<data>
<a>3</a>
<b>4</b>
</data>
</hoge>
以下のXSLはdataタグ配下のa*bの値をCSV形式で出力します
<?xml version=”1.0”?>
<xsl:stylesheet xmlns:xsl=”http://www.w3.org/1999/XSL/Transform” version=”1.0”>
<xsl:output method=”text”/>
<xsl:template match=”hoge”>
<xsl:for-each select=”data”>
<xsl:value-of select=”number(a)*number(b)”/>
<xsl:text>,</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
http://www.atmarkit.co.jp/fxml/tanpatsu/xslt/xslt05.html
サンプルで覚えるXSLTプログラミング
XSLT は初めて使ってみましたが、いちおう以下ので 14 と出るみたいです。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="alldata">
<xsl:variable name="goukei">
<xsl:call-template name="wa">
<xsl:with-param name="left_data" select="count(//data)"/>
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="$goukei"/>
</xsl:template>
<xsl:template name="wa">
<xsl:param name="left_data" select="0"/>
<xsl:param name="current_sum" select="0"/>
<xsl:choose>
<xsl:when test="$left_data < 1">
<xsl:value-of select="$current_sum"/>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="total">
<xsl:call-template name="wa">
<xsl:with-param name="left_data" select="$left_data - 1"/>
<xsl:with-param name="current_sum" select="$current_sum + data[$left_data]/a * data[$left_data]/b"/>
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="$total"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
無事出力されました。
ありがとうございます。
http://d.hatena.ne.jp/rna/20060221/p3
児童小銃 - question:1140500672 の解答例
とりあえずこんな感じで。
XSLT 1.0 の変数はテンプレートの呼び出し中しか値が保持されず、プログラミング言語で言う関数の戻り値みたいなのもないので、テンプレートの再帰呼び出しでパラメータを渡していって呼び出した先で計算を続行する、みたいな形にします。めんどくさいですね。
拡張関数を定義していいのなら逃げ道はありますが。。。
ありがとうございます。
正しく表示されました。
乗算は大丈夫です。
各a*bの合計を求めたいです。