XPath関数で数値の平均値を計算する
XPath関数の文字列を整形するformat-number、ノード数を数えるcount、合計値を計算するsumを使って、<price>要素の平均値を計算してみます。
カテゴリ | XPath | |
関連要素 | sum、count、format-number | |
関連記事 | XPath関数で部分テキストを出力する |
「XPath関数」は出力するノード値を加工、演算するためのさまざまな機能を提供します。別稿「XPath関数で部分テキストを出力する」では主要な文字列関数concat、substringを解説しましたが、ここでは残る数値関数、ノードセット関数、XSLT関数を使ってみましょう。
以下は、books.xml(別稿「外部サブセットを利用して、DTDをXML文書から分離する」を参照)の内容をテーブル表示するXSLTスタイルシートです。ただし、<price>要素の値について千単位の区切り文字を付加し、また、最終行に単価の平均値を求めてみます。
<?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.