- PR -

XSLTからの最大値から最小値の除算

1
投稿者投稿内容
hogehoge
会議室デビュー日: 2006/05/15
投稿数: 5
投稿日時: 2006-06-18 22:08
いつもお世話になっています。
先に質問したグループ化はうまくいったのですが、
そこから先でつまってしまいましたので、質問させてもらいます。

XMLファイルが以下のようになっています

<id>
<item>
<sec>12</sec>
<ipaddress>123.1.2.103</ipaddress>
</item>
<item>
<sec>14</sec>
<ipaddress>123.1.2.102</ipaddress>
</item>
<item>
<sec>11</sec>
<ipaddress>123.1.2.102</ipaddress>
</item>
<item>
<sec>0</sec>
<ipaddress>123.1.2.103</ipaddress>
</item>
<item>
<sec>10</sec>
<ipaddress>123.1.2.103</ipaddress>
</item>
<item>
<sec>100</sec>
<ipaddress>123.1.2.103</ipaddress>
</item>
<item>
<sec>1100</sec>
<ipaddress>123.1.2.104</ipaddress>
</item>
<item>
<sec>1000</sec>
<ipaddress>123.1.2.104</ipaddress>
</item>
</id>

そこから、IPアドレスでグループ化して、

123.1.2.102
123.1.2.103
123.1.2.104

と重複行を省きます。


そこから各IPのsecの最大値から最小値を引いた値「123.1.2.102の場合は14-11=3」がほしいのですが
NaNとなってしまいうまくいきません。

xsltは
<?xml version="1.0" encoding="SHIFT_JIS"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<table border="1">
<xsl:for-each select="/log/item[not(ipaddress = preceding-sibling::item/ipaddress)]">
<tr>
<td>
<xsl:value-of select="ipaddress"/>
</td>
<td>
<xsl:value-of select="sec"/>
</td>
<td>
<xsl:call-template name="calc2">
<xsl:with-param name="arg1">
<xsl:value-of select="sec" />
</xsl:with-param>
</xsl:call-template>
</td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
<xsl:template name="calc2">
<xsl:param name="arg1">1</xsl:param>
<xsl:value-of select="/log/item/sec[position()='1'] - /log/item[last()]" />
</xsl:template>
</xsl:stylesheet>

となっています。

もしお分かりの方がいましたら、ご助言をよろしくお願いします
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2006-06-19 10:49
何はともあれ、体を動かして、デバッグ出力
<xsl:value-of select="/log/item/sec[position()='1'] - /log/item[last()]" />
式の項をバラして 見ましょう
COPY-OF SELECT /log/item/sec[position()='1']
COPY-OF SELECT /log/item[last()]

========= と言うより
こういう、濃いプログラム処理は XQuery の守備範囲ですが
XSLT でやろうとすると、関数の少なさで泣くよ(普通の体力の人なら)。

[ メッセージ編集済み 編集者: MMX 編集日時 2006-06-19 10:53 ]
hogehoge
会議室デビュー日: 2006/05/15
投稿数: 5
投稿日時: 2006-06-19 11:24
MMXさま。
ご助言ありがとうございます。

おっしゃられるとおり、体を動かしてデバッグしてみます。
普段はプログラムをゴリゴリ書いているものなので、
毛色の違う、XSLTはなかなか馴染めないし難しいです。

XQuery。
いい機会なので、こちらも勉強してみます。
1

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