- PR -

sum() について教えてください

1
投稿者投稿内容
あき
会議室デビュー日: 2002/04/15
投稿数: 2
お住まい・勤務地: 東京都港区
投稿日時: 2002-04-15 18:35
xsl をはじめて1ヶ月のものです。色々調べたのですが、分からないことがあります。

-----------------xml
<data>
<dataSET>
<kingaku>9000</kingaku>
</dataSET>
<dataSET>
<kingaku></kingaku> ★★★
</dataSET>
<dataSET>
<kingaku>1000</kingaku>
</dataSET>
<dataSET>
<kingaku>0</kingaku>
</dataSET>
</data>....

-----------------xsl
<xsl:value-of select="sum(./data/dataSET/kingaku)" />

-----------------html(出力)

kingaku の詳細一覧 +
kingaku の合計が表示される予定。


=======================================================
文字列を数値に変換してその合計を計算してくれる関数としてsum()がありますが、
もし、上記のxml(★)のように、nullのデータが含まれる場合、
出力結果が"NaN"となってしまいます。

どうしたらよいでしょうか?
ちなみに
<kingaku>0</kingaku>
<kingaku></kingaku>
の2パターンで、出力方法は違います。

htmlのソース
0 のとき→ 0円
null のとき→ #&160;(スペース)

よろしくご指導ください。


[ メッセージ編集済み 編集者: あき 編集日時 2002-04-15 18:55 ]
あき
会議室デビュー日: 2002/04/15
投稿数: 2
お住まい・勤務地: 東京都港区
投稿日時: 2002-04-15 20:58
すみません。
sumを使ってできました。

xslで簡単にできるんじゃという思いから
sum()に執着していました。

よくsampleに載っているようにscriptでやるしか
ないかなぁと思っていました。
でも、textを追加しただけでできました。
修正時間たったの3秒。

本当に勉強不足でした。
今度から、もっと調べてから投稿します。
まみ
会議室デビュー日: 2003/06/27
投稿数: 12
投稿日時: 2004-02-27 13:57
お世話になっております。
同じ問題で悩んでおります。

text追加でどのようになるでしょうか?
どなたかご教授して下さい。
ほむら
ぬし
会議室デビュー日: 2003/02/28
投稿数: 583
お住まい・勤務地: 東京都
投稿日時: 2004-02-27 14:28
ほむらです。
--------
試していませんけどたぶんXPathを利用したのではないでしょうか?
<xsl:value-of select="sum(./data/dataSET/kingaku[./text() != ''])" />
見たいな感じで。。。
まみ
会議室デビュー日: 2003/06/27
投稿数: 12
投稿日時: 2004-02-27 14:51
ほむらさん 

さっそくのご回答どうもありがとうございます。
すいません・・・ 初歩的な質問で・・・ 
検討した結果・・・ 
現在、下記のようなデータの持ち方をしているのですけど
適用できません・・・(泣
データの持ち方が悪いって言うならそれまでなんですけど・・・

-----------------xml
<data>
<kingaku1>9000</kingaku1>
<kingaku2></kingaku2> ★★★
<kingaku3>1000</kingaku3>
<kingaku4>0</kingaku4>
</data>

-----------------xsl

boolean(number(kingaku1) 判定
数値ではない 変数 = 変数 + 0
数値である  変数 = 変数 + kingaku1

boolean(number(kingaku2) 判定
数値ではない 変数 = 変数 + 0
数値である  変数 = 変数 + kingaku2

  :
  :
  :

最後に合計結果を出力する。

のようにやろうと思っているですけど・・・
今、現段階で調べていると変数に代入できない?! (−−;


おばけ
ぬし
会議室デビュー日: 2002/11/14
投稿数: 609
お住まい・勤務地: 東京都江東区
投稿日時: 2004-02-27 15:29
引用:

今、現段階で調べていると変数に代入できない?! (−−;


ええ、そうですよ
変数の宣言はxsl:variableで出来ますし、初期値も代入できます。
ですが、既に宣言済みの変数には値を代入することが出来ません。
従って、ループカウンタのような変数を作ることも出来ません。
そこは、ちょっと不便なところです。

# 実は、ループカウンタを使わずに逃げられるケースもあります。
# 再帰的にテンプレートを呼んだり、position()を活用したりして。

ちなみに、XSLTプロセッサの実装依存であり余りお勧めではありませんが、
カスタムのJavaロジックを開発してしまいそれをXSLTスタイルシートから呼ぶ、
という手もあります。Xalan-Jとかだと出来ます。

例えば、substring-before()とかsubstring-after()だと、指定した文字列が最初に
マッチする位置を基点に考えるため、Javaで言うところのjava.lang.String#indexOf
を使った挙動になります。しかし、場合によっては指定した文字列が最後にマッチ
した位置を基点に考えたいこともあり、そのためjava.lang.String#lastIndexOfの
挙動が欲しくなります。

で、無い頭で考えあぐねた末(笑)、Javaでやっちゃいました。
こんなところ↓を読むと参考になります。
http://www.atmarkit.co.jp/fxml/tanpatsu/xslt/xslt15.html

横槍ですが、ご参考までに、、、


[ メッセージ編集済み 編集者: おばけ 編集日時 2004-02-27 15:32 ]
ほむら
ぬし
会議室デビュー日: 2003/02/28
投稿数: 583
お住まい・勤務地: 東京都
投稿日時: 2004-02-27 15:41
ども、ほむらです。
----
涼子氏へ
>適用できません・・・(泣
なにがですか?

まぁ、条件がかけなかったということで解釈して。。。
つまり、異なる要素での合計を出したいということですよね?
個人的には要素の名前でなくて属性で区別したほうが良いようにも思いますが。
コード:

<xsl:template match="/data">
<xsl:value-of select="sum(child::node()[contains(name(),'kingaku') != false ][boolean(number(./text()))!= false])"/>
</xsl:template>


とやれば、一応計算の結果は出ます。
axisをもっとうまく使えばもっと可読性の高いものが作れるかもしれませんが。

たのしいXMLとかでいろいろ載っていますよ。
最近は再構成ということで以前ほどの情報はありませんけど
十分、助けてくれます。
axisの家系図見たいのはものすごくわかりやすかった。

#ちょっと、見やすくしてみた。


[ メッセージ編集済み 編集者: ほむら 編集日時 2004-02-27 15:52 ]
まみ
会議室デビュー日: 2003/06/27
投稿数: 12
投稿日時: 2004-02-27 16:23
ほむら 様

ありがとーうございます! (TOT)感涙

> <xsl:value-of select="sum(child::node()[substring(name(),0, = 'kingaku'][./text() != '' and number(./text())])"/>

このヘンになると・・・ かなり上級ですね・・・汗
substringってそんな風に使えるですね!
ご親切にどうもありがとうございます。
>たのしいXML
はい。必読してます。
型にハズレると・・・
チンプンカンプンに・・・涙

私なりに考えたのですけど・・・

変数宣言

<xsl:variable name="zerokingaku1">
<xsl:choose>
<xsl:when test="boolean(number(kingaku1))">
<xsl:value-of select="kingaku1" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="0" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>

<xsl:variable name="zerokingaku2">
<xsl:choose>
<xsl:when test="boolean(number(kingaku2))">
<xsl:value-of select="kingaku2" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="0" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>

  :
  :
  :

出力

<xsl:value-of select="$zerokingaku1+zerokingaku2+zerokingaku3・・・" />

タグが10個なので・・・ 
10個宣言しちゃいました・・・w
足し算だけで1日使っちゃったー! o(><)o

ほむら様 親切にどうもありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)