人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

XSLTに関する質問です。

下記のようなXMLがある時、
<data>
<a>1</a>
<b>2</b>
</data>
<data>
<a>3</a>
<b>4</b>
</data>
a * b の合計はどのように表記するのでしょうか。

●質問者: jun0429
●カテゴリ:コンピュータ
✍キーワード:XML XSLT
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● dev_zer0
●10ポイント

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>

◎質問者からの返答

乗算は大丈夫です。

各a*bの合計を求めたいです。


2 ● たも
●25ポイント

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 &lt; 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>

◎質問者からの返答

無事出力されました。

ありがとうございます。


3 ● rna
●25ポイント

http://d.hatena.ne.jp/rna/20060221/p3

児童小銃 - question:1140500672 の解答例

とりあえずこんな感じで。


XSLT 1.0 の変数はテンプレートの呼び出し中しか値が保持されず、プログラミング言語で言う関数の戻り値みたいなのもないので、テンプレートの再帰呼び出しでパラメータを渡していって呼び出した先で計算を続行する、みたいな形にします。めんどくさいですね。


拡張関数を定義していいのなら逃げ道はありますが。。。

◎質問者からの返答

ありがとうございます。

正しく表示されました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ