XPath関数で部分テキストを出力するXMLテクニック集(5)(2/3 ページ)

» 2003年09月09日 10時00分 公開
[山田祥寛@IT]

XPath関数で数値の平均値を計算する

アイコン

XPath関数の文字列を整形するformat-number、ノード数を数えるcount、合計値を計算するsumを使って、<price>要素の平均値を計算してみます。

カテゴリ XPath
関連要素 sum、count、format-number
関連記事 XPath関数で部分テキストを出力する

 「XPath関数」は出力するノード値を加工、演算するためのさまざまな機能を提供します。別稿「XPath関数で部分テキストを出力する」では主要な文字列関数concat、substringを解説しましたが、ここでは残る数値関数ノードセット関数XSLT関数を使ってみましょう。

 以下は、books.xml(別稿「外部サブセットを利用して、DTDをXML文書から分離する」を参照)の内容をテーブル表示するXSLTスタイルシートです。ただし、<price>要素の値について千単位の区切り文字を付加し、また、最終行に単価の平均値を求めてみます。

[avg.xsl]
<?xml version="1.0" encoding="Shift_JIS" ?>
<xsl:stylesheet
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="/">
    <html>
    <head>
    <title><xsl:value-of select="books/@name" /></title>
    </head>
    <body >
    <h1><xsl:value-of select="books/@name" /></h1>
    <table border="1">
    <tr>
      <th>ISBNコード</th><th>書名</th><th>著者</th>
      <th>出版社</th><th>価格</th><th>発刊日</th>
    </tr>
    <xsl:for-each select="books/book">
      <xsl:sort select="published" 
                data-type="text" order="descending" />
      <xsl:sort select="price" 
                data-type="text" order="ascending" />
      <tr>
        <td nowrap="nowrap"><xsl:value-of select="@isbn" /></td>
        <td nowrap="nowrap"><xsl:value-of select="title" /></td>
        <td nowrap="nowrap"><xsl:value-of select="author" /></td>
        <td nowrap="nowrap">
          <xsl:value-of select="published" /></td>
        <td nowrap="nowrap">
          <xsl:value-of select="format-number(price,'#,###')" /></td>
        <td nowrap="nowrap">
         <xsl:value-of select="publishDate" /></td>
      </tr>
    </xsl:for-each>
    <tr>
      <td></td><td></td><td></td>
      <th>平均価格</th>
      <td>
        <xsl:value-of
         select="format-number(sum(books/book/price) div 
count(books/book/price),'#,###')" />
      </td>
    </tr>
    </table>
    </body>
    </html>
  </xsl:template>
</xsl:stylesheet>
価格のけた区切り文字と平均価格が追加された 価格のけた区切り文字と平均価格が追加された(画像をクリックすると全体を表示します)

 以下の部分に注目してください。

<td nowrap="nowrap">
  <xsl:value-of select="format-number(price,'#,###')" />
</td>
  …略…
<td>
  <xsl:value-of
   select="format-number(sum(books/book/price) div 
count(books/book/price),'#,###')" />
</td>

 format-number(numVal,strPtn[,strNam])は、XPath関数の中でもXSLT関数に分類される関数の1つで、引数に指定された数値numValを文字列パターンstrPtnの形式で整形します。strPtnに指定できるパターン文字列は以下のとおりです。

パターン文字列 概要
# 有効けた数のみを表示。余分な0は表示されない
0 指定されたけた数分だけ表示。値がけた数に満たない場合、ゼロを補完する
, 千単位のけた区切り文字
. 小数区切り文字

 strNamは任意に指定できる引数で、“europian”などのロケール名を指定します。

 数値データの整形については、<xsl:decimal-format>要素によっても可能です。<xsl:decimal-format>要素については、別稿にてまた詳述することにします。

 次に、count(nodSet)は、XPath関数の中でもノードセット関数に分類される関数の1つで、引数に指定されたパスに合致するノードの個数を返します。sumは数値関数に分類され、引数に指定されたパスに合致する数値データの合計値を返します。

 つまり、ここでは<price>要素(書籍単価)の値を合計し、書籍数で割り算することで(div)、書籍単価の平均値を求めているわけです。割り算の演算子には「/」ではなく「div」を使用する点に注意してください。XPathでは、「/」はパスの区切り文字として認識されます。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。