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="UTF-8" ?>
<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.