XMLとXSLTの簡単な解説
XMLとXSLTの簡単な解説をします。
○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○ ○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○ ○○○○○○○○○○○○○○○○○○○ ○○○○○○○○○○○○○○○○○○○○○○ ○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○ ○○○○○○○○○○○○○○○○○○○○○○○○○○○
XMLとはデータをネットワーク経由で送受信するための言語で、ユーザが独自のタグを指定できる、メタ言語の一種である。 XSLTとは、XMLデータをHTMLデータやテキストデータ等に変換するための言語である。 私が興味のある企業のページは元となるxml文書を、 XSLTを用いてhtmlのページに変換したものである。 このページでは、 私が興味のある企業のページを作るために使われているxslt文書を一番上の行から順に説明する。 なお、説明を見るときは、上のリンクにある変換に使用したxslt文書と合わせて見てもらえると構造がわかりやすいであろう。
<?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" encoding="shift_jis" />
一番の上の行はxml宣言である。次の行からがスタイルシートのルート要素であり、 xsltの最後は</xsl:stylesheet>で終わる。また、この部分でスタイルシートの名前空間を指定している。 名前空間とは、ある要素・属性がどの名前空間に属しているのかを見分けるためのもである。 つまり、同じボキャブラリに属する要素や属性の名前を1つの集合としてとらえ、要素・属性の名前が同じであっても、 属する集合が異なれば別の要素・属性と見なすことができ、これにより名前の衝突を避けることができる。 次の<xsl:output〜はファイルの出力形式と文字コードを指定する部分で、 ここでhtmlと指定することで、元のxml文書を以下の<xsl:template>の中の文によってhtmlに変換することができる。
<xsl:template match="/">
<html>
<head>
   <title>興味のある企業</title>
   <link rel="stylesheet" type="text/css" href="company.css" />
</head>
<body>
    <xsl:apply-templates />
</body>
</html>
</xsl:template>
<xsl:template>と</xsl:template>で囲まれた範囲がテンプレートと呼ばれるXSLTの主要部である。 XML文書の中のどこをどのように変換するかという変換ルールを、テンプレートによって記述する。 テンプレートの中身は上から順に実行される。この例では、<html>から</html>までで、htmlの基本構造を記述している。 <body>タグの次に<xsl:apply-templates />があるが、プログラムがこの文に来ると下で紹介する<xsl:template match="企業住所録リスト">(これはxml文書のルート要素である) に移動し、その命令を実行したあとに</body>に戻る。
<xsl:template match="企業住所録リスト">
<div class="title">私が興味のある企業</div>
<div class="syoukai">
このページでは、私が興味のある企業を紹介します。このページはxml,xsltcssを用いて作成されています。
</div>
<div class="koumoku">売り上げ金額の多い順</div>
<div class="center">
<table class="table1">
<tr>
<th class="td1">企業</th>
<th>売り上げ金額</th>
<th class="td1">ホームページ</th>
<xsl:for-each select="企業住所録">
<xsl:sort select="売上金額" data-type="number" order="descending"/>
<tr>
<td><xsl:value-of select="社名"/></td>
<td><xsl:value-of select="売上金額"/><xsl:value-of select="売上金額/@単位"/></td>
<td><a><xsl:attribute name="href"><xsl:value-of select="ホームページ"/></xsl:attribute><xsl:value-of select="ホームページ"/></a></td>
</tr>
</xsl:for-each>
</tr>
</table>
</div>
上で述べたように、プログラムは<xsl:apply-templates />によって<xsl:template match="企業住所録リスト">に移動し、それ以下の命令が実行される。 そしてhtmlを記述していき、途中の<xsl:for-each select="企業住所録">という命令にぶつかる。 この命令により、「企業住所録」ノード(タグ)の下の「社名」「住所」などのノードがカレントノード(現在処理しているノード)となり、 それらについて<xsl:for-each select="企業住所録">の中の命令を繰り返し実行することになる。 <xsl:sort select="売上金額" data-type="number" order="descending"/>の文は、売上金額というノードを降順で並び替える命令である。 次の<xsl:value-of select="社名"/>という文は、XML文書中の社名ノードの文字列値をHTMLに出力せよという命令である。 これと似た<xsl:value-of select="売上金額/@単位"/>という文があるが、この「@単位」の部分は、xml文書の属性の部分を指定している。 つまりこの命令は、売上金額の単位を出力せよという命令である。 次の<a><xsl:attribute name="href"><xsl:value-of select="ホームページ"/></xsl:attribute><xsl:value-of select="ホームページ"/></a>という文で、 htmlのリンクを張ることと同じことを実現している。xsltでhtmlのリンクを書くにはこのように指定すればよい。
<div class="koumoku">社員数の多い順</div>
<div class="center">
<table class="table1">
<tr>
<th class="td1">企業</th>
<th>社員数</th>
<th class="td1">ホームページ</th>
</tr>
<xsl:for-each select="企業住所録">
<xsl:sort select="社員数" data-type="number" order="descending"/>
<tr>
<td<xsl:value-of select="社名"/></td>
<td<xsl:value-of select="社員数"/>人</td>
<td><a><xsl:attribute name="href"><xsl:value-of select="ホームページ"/></xsl:attribute><xsl:value-of select="ホームページ"/></a></td>
</tr>
</xsl:for-each>
</table>
</div>
この命令は先に説明した「売り上げ金額の多い順」の命令とほとんど同じで、新しく説明する部分はない。 私が興味のある企業のページと、元となるxml文書を参照してみるとこれらの命令がより理解しやすくなるであろう。
<div class="koumoku">一人あたりの売り上げ金額の多い順(2億以下は赤にしています)</div>
<div class="center">
<table class="table1">
<tr>
<th class="td1">企業</th>
<th>売上金額</th>
<th class="td1">ホームページ</th>
</tr>
<xsl:for-each select="企業住所録">
<xsl:sort select="(売上金額)div(社員数)" data-type="number" order="descending"/>
<tr>
<td><xsl:value-of select="社名"/></td>
<td>
<xsl:choose>
<xsl:when test="(売上金額)div(社員数) < 2">
<span class="red"><xsl:value-of select="format-number((売上金額 div 社員数),'###.##')"/><xsl:value-of select="売上金額/@単位"/></span>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="format-number((売上金額 div 社員数),'###.##')"/><xsl:value-of select="売上金額/@単位"/>
</xsl:otherwise>
</xsl:choose>
</td>
<td><a><xsl:attribute name="href"><xsl:value-of select="ホームページ"/></xsl:attribute><xsl:value-of select="ホームページ"/></a></td>
</tr>
</xsl:for-each>
</table>
</div>
この命令も今までとほとんど同じ命令が使用されているが、もし一人あたりの売上金額が2億円以下ならば赤色で表示するという条件分岐を使用している。 今回上で使われている<xsl:choose>という条件分岐構文は、 <xsl:choose>の中に<xsl:when test=条件式>条件に合ったときの処理</xsl:when>と書くことで条件分岐をする。 ここでは、条件式に”(売上金額)div(社員数) < 2”と書くことで、「一人あたりの売上金額が2億円以下」という条件になる(divとは割り算を表す)。 <xsl:otherwise>は「そのほかの場合」を意味し、その中には「一人あたりの売上金額が2億円以下ではない場合」の処理を書く。 最後に</xsl:choose>で閉じることによって条件分岐が終了する。 なお、'###.##'という記述があるが、これは「表示する数値を小数点第2位まで表示せよ」、という意味である。
<xsl:for-each select="企業住所録">
<div class="koumoku"><xsl:value-of select="社名"/></div>
<div class="center">
<table class="table1">
<tr><td class="td1"><xsl:text>住所</xsl:text></td>
<td>
<xsl:text>郵便番号</xsl:text><xsl:value-of select="住所/郵便番号"/>
<xsl:text>都道府県</xsl:text><xsl:value-of select="住所/都道府県"/>
<xsl:text>区市町村</xsl:text><xsl:value-of select="住所/区市町村以下"/
</td>
</tr>
<tr><td>
<xsl:text>分野</xsl:text>
</td><td>
<xsl:value-of select="分野リスト/@分野"/><br/>
</td></tr>
<tr><td>
<xsl:text>社員数</xsl:text>
</td><td>
<xsl:value-of select="社員数"/>人<br/>
</td></tr>
<tr><td>
<xsl:text>売上金額</xsl:text>
</td><td>
<xsl:value-of select="売上金額"/><xsl:value-of select="売上金額/@単位"/>
</td></tr>
<tr><td>
<xsl:text>ホームページ</xsl:text>
</td><td>
<xsl:value-of select="ホームページ"/><br/>
</td></tr>
</table>
</div>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
ここで使用されている新しい命令文は、xsl:textという文である。これは正確な文字列を生成する命令で、 <xsl:text>と</xsl:text>の間に記述する。ここであえて使う必要はない命令だが、 CSVファイル(改行文字が行末に必要)やプログラムソースコード(>,<,などの特殊文字が必要)などを結果ツリーに出力する場合などには、 この<xsl:text>を使うとよいので、覚えておいて損はない。 プログラムが最後まで来ると、一番上の説明で見た</body>の部分に戻り、</html>で閉じることによってhtml文書が完成する。
htmlのテーブルやcssのクラスなどによって、少し見にくい説明になってしまったが、使っているxsltの命令自体は非常に少ない。 しかし、少ない命令で元のxml文書を効率よく変換することができるため、これからも重宝されていく言語であることは間違いないであろう。
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送