since 2004/05

第3回 データの指定方法

前回、長くなっちゃったので、今回は短く。

今回は、XMLデータ内から、見たいデータを指定する方法を説明します。

まず、ちょっと複雑なXMLデータを準備します。

<?xml version="1.0" encoding="Shift_JIS"?> <?xml-stylesheet type="text/xsl" href="sample03.xsl"?> <whatsnew> <title>更新履歴</title> <new> <date>06/15</date> <rev>日記更新</rev> </new> <new> <date>06/17</date> <rev>MONO更新</rev> </new> <new> <date>06/19</date> <rev>ETC更新</rev> </new> </whatsnew>

では、この中のtitleを取得し、HTMLのtitleタグで使用するには? 次のように指定することで、titleを取得することが出来ます。

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: <title> 08: <xsl:value-of select="whatsnew/title" /> 09: </title> 10: </head> 11: <body> 12: </body> 13:</html> 14:</xsl:template> 15:</xsl:stylesheet>

08行の部分で指定しています。 なぜこのような指定になるかというと、このテンプレートがルート(最上位)を指しているテンプレート なので、このような指定になります。 ところでこの指定方法、どこかで見たことありませんか? そう、フォルダや、サイト等と指定方法は同じなんです。 なので、例えばここに日付を指定するなら、 08行の部分が

08: <xsl:value-of select="whatsnew/new/date" />

となるわけです。 では。 次に、newの中のdateとrevを表示させて見ましょう。

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: <title> 08: <xsl:value-of select="whatsnew/title" /> 09: </title> 10: </head> 11: <body> 12: <xsl:value-of select="whatsnew/new/date" /> 13: <xsl:value-of select="whatsnew/new/rev" /> 14: </body> 15:</html> 16:</xsl:template> 17:</xsl:stylesheet>

うーん、これでも表示されるのですが、これだと最初のnewの中身しか表示されません。 じゃどうすればいいかというと、

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: <title> 08: <xsl:value-of select="whatsnew/title" /> 09: </title> 10: </head> 11: <body> 12: <xsl:apply-templates /> 13: </body> 14:</html> 15:</xsl:template> 16:<xsl:template match="new"> 17: <xsl:value-of select="date" /> 18: <xsl:value-of select="rev" /> 19:</xsl:template> 20:</xsl:stylesheet>

前回使った、apply-templatesが12行に出てきます。 これは、ここに別のテンプレートを差込ますよー、という命令で、ここの様に 何も指定しない場合、一致したテンプレートがあれば、そのテンプレートを勝手に 差し込みます。 なので今回の場合だと、newが出てくるたびに、16行からのnewテンプレートが 差し込まれます。 さて、ここで問題。 一致しないテンプレートタグ(間違えてましたゴメンナサイTT)があった場合はどうなるか? 実はそのままデータのみ表示されます。 つまり、上のテンプレートだと、titleの「更新履歴」まで表示されてしまいます・・・ こんな感じで表示されます XSL まぁ個人的には、これはこれでいいような気もしますが・・・ 思惑とは違うので、テンプレートを修正します。 といっても、1行だけ。 12行目を

12: <xsl:apply-templates select="whatsnew/new" />

に変えるだけで、newだけが連続で表示されるようになります。 完成〜味気ないけど XSL さて、この12行目ですが、whatsnew/newと指定しているのに、newが参照されるのは なぜ???と思われるかもしれません。 これは「whatsnewの中にあるnew」という意味になります。 このあたりの考え方もフォルダと同じですね。 ちなみにここでselect="new"と指定しても、何も表示されません。 ルートの下にnewなんてありませんから。(ルートの下はwhatsnewになります。) よく(管理人は)このあたりの指定方法で、勘違いして何も表示されねーよ、何でだよー と悩むことが多々ありますので、皆さんもお気を付けを。 それとちょっと特殊な指定方法でselect="."というのがあります。 これはカレントデータ(意味合い的には、現在位置って感じかな。下の例の様にdataタグ テンプレートで、自分自身のデータを指すって意味です。)を取得する場合に使います。 具体的に言うと、

<xsl:template match="date"> <xsl:value-of select="." /> </xsl:template>

こんな感じで、テンプレート自体が指しているデータを取得する場合に使います。 説明は以上です。 ここが解れば、どんなに複雑なデータでも(混乱しますが^^;)指定できます。きっと・・・ 次はもっとHTMLと絡めて、見栄え良く(またかよ)してみようかと思います。 結局長くなったな・・・

kajikaji
kajikaji