取り敢えず下のURLをクリックしてください。
https://hi-kaka.com/tmp/chibaTenki.xml
前回ご紹介した、気象庁のデータをダウンロードし、下に示すXSLTファイルを関連づけました。ブラウザはchibaTenki.xmlファイルをXSLTで整形して表示しています。
chibaTenki.xmlの修正は、2行目に次の文を追加しただけです。
<?xml-stylesheet type=”text/xsl” href=”./chibaTenki.xslt”?>
ブラウザだけでなく、大抵の言語、Php、Java、Javascript、Perl、.NETで、XMLをXLST変換して新たなXMLを作成することができます。
ここで、chibaTenki.xsltが問題のXSLTファイルです。
久しぶりに手探りでXSLTを作成したし、決して立派なものではありません。XSLTをご存知ない方に、「XSLTとはこんなものです」というくらいのサンプルです。
コードを簡単にご説明します。
<xsl:template match=”/weatherforecast/pref”>(8行目)では、XMLドキュメントの”/weatherforecast/pref”タグを探して、あったらprefタグの処理をします。
ここでしていることは、出力をHTMLタグで囲んで(9行目から16行目)、HTMLファイルのタイトルを「千葉県の天気」とし、出力bodyタグの中、<xsl:apply-templates select=”area”/>(14行目)で、「以下は<xsl:template match=”area”>に任せる」としています。
制御は<xsl:template match=”area”>(18行目)に移り、18から31行目の中でareaタグの処理をします。
続いて制御が<xsl:template match=”info”>(33行目)に移り、必要な処理をした後に、<xsl:call-template name=”RAIN”/>(58行目)でサブルーチン・テンプレートをコール、<xsl:template name=”RAIN”>(61行目)の中で、rainfallchanceタグの処理をします。
<?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" indent="yes"/> <xsl:variable name="prefecture" select="/weatherforecast/pref/@id"/> <xsl:template match="/weatherforecast/title|link|description|pubDate|author|managingEditor|"> <xsl:text/> </xsl:template> <xsl:template match="/weatherforecast/pref"> <html> <head> <title>千葉県の天気</title> </head> <body> <xsl:apply-templates select="area"/> </body> </html> </xsl:template> <xsl:template match="area"> <table border="1" width="700"> <tbody> <tr> <th> <xsl:value-of select="$prefecture"/> <xsl:text> </xsl:text> <xsl:value-of select="@id"/> <xsl:apply-templates select="info" /> </th> </tr> </tbody> </table> </xsl:template> <xsl:template match="info"> <tr> <th>日時 <xsl:value-of select="@date"/> </th> </tr> <tr> <td/> <td> <xsl:value-of select="weather"/> </td> </tr> <tr> <td/> <td> <xsl:value-of select="weather_detail"/> </td> </tr> <tr> <td/> <td> <table> <tbody> <tr> <td> <xsl:text>気温 </xsl:text> </td> <td> <xsl:value-of select="temperature/range[@centigrade='min']"/> <xsl:text> から </xsl:text> <xsl:value-of select="temperature/range[@centigrade='max']"/> </td> </tr> </tbody> </table> </td> </tr> <xsl:call-template name="RAIN"/> </xsl:template> <xsl:template name="RAIN"> <tr> <td/> <td> <table> <tbody> <tr> <td> <xsl:text>降水率 </xsl:text> </td> </tr> <xsl:call-template name="RAINBYHOUR"/> </tbody> </table> </td> </tr> </xsl:template> <xsl:template name="RAINBYHOUR"> <xsl:for-each select="rainfallchance/period"> <xsl:sort select="@hour"/> <tr> <td> <xsl:text> </xsl:text> <xsl:value-of select="@hour"/> <xsl:text> </xsl:text> <xsl:value-of select="."/> <xsl:text> % </xsl:text> </td> </tr> </xsl:for-each> </xsl:template> </xsl:stylesheet>
余談ですが、私は10年以上前に[XML Spy]というソフトを購入しました。
「使用権は永久」ということで安心していたのですが、今回これを引っ張り出して使おうとするとうまくいきません。
Altova社にメールしたら、私のライセンスは一度更新していて、最新の(といっても10年前の)ライセンス番号を送ってくれました。
というわけで、今回[XML Spy 2004]を使ってXLSTファイルを作成しました。
そんな訳で、上のXSLTファイルの2行目にstylesheet を宣言していますが、最新のXSLT2.0では、このstylesheet文を使わないことが推奨されているようです。
ここ数回に亘って、XMLについて少し整理しました。
XML処理の話はこれでおしまいです。