since 2004/05

第7回 XSLの便利機能その2

前回に続き、XSL便利機能に付いて説明します。
今回はまず、「現在位置を調べる」から。

これは、えーと例えば今まで何度となく出てきている、日記のXMLデータで言うと、
6/15日は何番目、6/16日は何番目・・・といった感じで、それぞれのデータの位置を
番号で知ることが出来ます。
では、早速XSLを見てみましょう。XSLデータは相変わらずの日記です。
(データ作るのが面倒とかそういうのじゃないんだヨ・・・)

01:<?xml version="1.0" encoding="Shift_JIS"?> 02:<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 03:<xsl:output method="html" encoding="Shift_JIS" /> 04:<xsl:template match="/"> 05: <html> 06: <head> 07: <style type="text/css" media="screen"> 08: @import url(style.css); 09: </style> 10: <title> 11; <xsl:value-of select="diary/title" /> 12: </title> 13: </head> 14: <body> 15: <div class="layout"> 16: <h3 class="since">since 2004/06</h3> 17: <div class="body"> 18: <div class="titleimg"> 19: <div class="titleshadow">What's XML</div> 20: <div class="titlemain">What's XML</div> 21: </div> 22: <h2 class="title">Diary</h2> 23: <p> 24: 気まぐれ日記〜 25: </p> 26: <xsl:apply-templates select="diary/form" /> 27: </div> 28: </div> 29: </body> 30: </html> 31:</xsl:template> 32:<xsl:template match="form"> 33: <table class="diary"> 34: <tr> 35: <td class="diarydate">(<xsl:value-of select="position()" />)<xsl:value-of select="date" /></td> 36: <td class="diarysubtitle"><xsl:value-of select="subtitle" /></td> 37: </tr> 38: <tr> 39: <td colspan="2" class="diaryexp"> 40: <pre> 41: <xsl:value-of select="diaryexp" /> 42: </pre> 43: </td> 44: </tr> 45: </table> 46:</xsl:template> 47:</xsl:stylesheet>

まず、ルートのテンプレート(match ="/"のテンプレート)は、第4回のものとまったく 同じです。 違うのは、formテンプレート(match="form"のテンプレート)です。 違うといっても、一行だけですが・・・ その一行とは35行目です。 ここの最初のvalue-ofで、select="position()"となっているところが、現在位置を取得している部分です。 命令がダブルクォートで囲まれて、変な感じがしますが、XSLでは他の命令もこのように表記します。 この例だと、formテンプレートの中で、select="position()"としているので、formタグの表示順に 番号が振られます。 こんな感じ。まったく意味のない番号が振られてるだけです・・・ まぁこの日記だと、番号なんて振る必要も無いんで、まったく意味ありませんが。データも3つしかないし。 そうだなぁ、CDや、本のコレクションを表示させる時に、XSL側でこれを使って番号表示させれば、結構 便利かと。(XMLデータ側でいちいち番号振る必要が無いからね。) さて、ここでもう一つの便利機能を。 それはプログラミング等でよくある、「条件(if)」です。 これはそのまんま、指定した条件にあっていれば実行、そうでなければ実行しない、というものです。 例えば、上記のXSLの32,33行の間に、 <xsl:if test="date = '06/16'"> を入れ、45,46行の間に、 </xsl:if> を入れて、XMLを表示させると、06/16の日記のみ表示されます。 (ifの意味が、「dateが06/16なら処理する」となるので。) で。 このifとさっきのposition()を組み合わせて、指定するタグを、指定する数だけ表示させることが 出来ます。 やり方は簡単。 さっきの32,33行に入れた、ifの行を <xsl:if test="position() &lt;= 2"> とすればいいだけです。 ただ、この行の中に見慣れない「&lt;」というのがあります。 実はこれ、「<」のことです。 XSLの中で「<,>」は、タグを囲むために使っている為、普通には使えません。 なので、このような書き方になっています。 ちなみに、「>」は&gt;、「&」は&amp;と書きます。 で、このifの意味は、「position()の値が、2以下なら処理する」になります。 と、言うことは。 6/15と6/16の2つのみが表示されます。 これに、「並べ替え」を組み合わせると、最新の日記を2つだけ表示させる、なんてことが出来ます。 XSLは以下の様になります。

01:<?xml version="1.0" encoding="Shift_JIS"?> 02:<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 03:<xsl:output method="html" encoding="Shift_JIS" /> 04:<xsl:template match="/"> 05: <html> 06: <head> 07: <style type="text/css" media="screen"> 08: @import url(style.css); 09: </style> 10: <title> 11: <xsl:value-of select="diary/title" /> 12: </title> 13: </head> 14: <body> 15: <div class="layout"> 16: <h3 class="since">since 2004/06</h3> 17: <div class="body"> 18: <div class="titleimg"> 19: <div class="titleshadow">What's XML</div> 20: <div class="titlemain">What's XML</div> 21: </div> 22: <h2 class="title">Diary</h2> 23: <p> 24: 気まぐれ日記〜 25: </p> 26: <xsl:for-each select="diary/form"> 27: <xsl:sort select="date" order="descending" /> 28: <xsl:if test="position() <= 2"> 29: <table class="diary"> 30: <tr> 31: <td class="diarydate"><xsl:value-of select="date" /></td> 32: <td class="diarysubtitle"><xsl:value-of select="subtitle" /></td> 33: </tr> 34: <tr> 35: <td colspan="2" class="diaryexp"> 36: <pre> 37: <xsl:value-of select="diaryexp" /> 38: </pre> 39: </td> 40: </tr> 41: </table> 42: </xsl:if> 43: </xsl:for-each> 44: </div> 45: </div> 46: </body> 47: </html> 48:</xsl:template> 49:</xsl:stylesheet>

えー、これは第6回で使った並べ替えのXSLに、28行目のifと、 42行のifの終りを足しただけですね。 これで最新の2日分だけを表示させることが出来ます。 最新の2日分 XSL これもここのHP(TOPに表示させている日記8日分)で使ってます。 っていうか、ここで使っている機能しか説明できないんですが^^; まぁ実際、日記ってのは日毎増えてくわけで、全部表示させると洒落にならないしね。 最新の何日分かを表示させてます。Diaryの方では全部表示させてるけどね・・・ さて、今回はここまで。 次回は・・・また便利機能になると思います。

kajikaji
kajikaji