XSLの基礎

はじめに

XSLはXMLのスタイルシート言語である。HTMLのスタイルシート CSSより高機能である。

CSS - HTMLのスタイルシート

HTMLは予め定義されたタグを使うので、これらのタグの意味はよく 理解されている。<p>要素は節を定義し、<h1>要素は 接頭を定義する。ブラウザはこれらの要素をどのように表示するかを 知っている。

XSL - XMLのスタイルシート

XMLは、私達が欲しいあらゆるタグを使うことができるように、 予め定義されたタグを使わないので、これらのタグの意味は理解されていない。 <table>はHTMLテーブルを意味するかも知れないし、家具の 一部かもしれない。XMLの本来の在り方からわかるように、ブラウザは XML文書をどのように表示するかを知らない。

XML文書を表示するため、その文書がどのように表示されるべきかを 記述するメカニズムをもつ必要がある。その1つがCSSだが、 XSL(the eXtensible Stylesheet Language)は好まれるXMLのスタイルシート 言語である。それはHTMLによって使われるCSSよりもはるかに高機能である。

XML - スタイルシートより多く

XSLは3つの部分から成っている。 もしこれらの意味がわからないなら、XSLを次のように思え。 XMLをHTMLに変換できる言語、XMLデータをフィルターし分類できる言語、 XML文書のパーツに宛名書きできる言語、マイナス値を赤に表示するというように データ値を基にしたXMLデータをフォーマットできる言語、そして、 スクリーンや紙や声のような異なったデバイスにXMLデータを出力できる 言語。

XSLはWorld Wide Web標準である

XSLはWorld Wide Webコンソーシアムによって奨励された標準である。

XSL言語

XSLは実際には3つの言語から成っている。最も重要な言語は XSLTである。

XSLは3つの言語

XSLは実際には3つの言語から成っている。 XSLTはXML文書をその文書の他のタイプか、他のXML文書に変換するための言語である。 XPathはXML文書のパーツを宛名書きするための言語である。XPathはXSLTによって 使われるように設計された。フォーマットは読者や聞き手のために適当な出力に XSL変換の結果をチューニングするための処理である。

XSLT - XSL変換

XSLTはXSL標準の最も重要な部分である。それはXSLの部分であり、 XML文書を他のXML文書にないしは他のタイプの文書に変換するのに使われる。 XSLTはXML文書をブラウザが認識可能なあるフォーマットに変換することが できる。そのようなフォーマットの1つがHTMLである。普通XSLTは おのおののXML要素を1つのHTML要素に変換することによってこれを実現する。 XSLTはまた、全く新しい要素を出力ファイルに追加することもできるし、 それらの要素を取り除くこともできる。XSLTはそれらの要素を再配置し 分類することができ、どの要素が表示されるかをテストし決定することも できる。 変換処理を記述する共通の方法は、XSLは1つのXMLソースツリー(XML ソース文書)を1つのXML結果ツリー(XML結果文書)に変化するために XSLTを使うと言うことである。

どのようにそれは働くか?

変換処理において、XSLTは1つ以上の予め定義されたテンプレートが 一致するソース文書の部分を定義するためXPathを使う。もし 1つ一致すると、XSLTはソース文書の一致したパーツを結果文書に 変換する。1つのテンプレートに一致しないソース文書のパーツは 変更されないという結果に終る。

XSLブラウザ

この時点でXSLをサポートするブラウザはたいへん少ない。 このチュートリアルではXSLをデモするためにIE5.0を用いる。

IE XMLパーザ

IE XSLエンジン

これはW3CのXSL奨励からの標準の方法である。
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
これは正しくないIEの方法である。
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/TR/WD-xsl">

IE MSXML

MSXML2.0はIE5.0で出荷されたXMLパーザの名前で、 MSXML2.5はWindows2000で出荷されたXMLパーザの名前である。 MSXML3.0は最新のXMLパーザである。 マイクロソフトによると、MSXML3.0は公式W3CのXSL奨励に100% 互換があるという。

XSL - 変換

XML文書でスタート

HTMLに変換したいXML文書でスタートする。
<?xml version="1.0"?>
<CATALOG>
  <CD>
    <TITLE>Empire Burlesque</TITLE>
    <ARTIST>Bob Dylan</ARTIST>
    <COUNTRY>USA</COUNTRY>
    <COMPANY>Columbia</COMPANY>
    <PRICE>10.90</PRICE>
    <YEAR>1985</YEAR>
  </CD>
.
.
.

XSLスタイルシート文書を作る

そして、変換テンプレートを持ったXSLスタイルシートを作る。
<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
  <html>
  <body>
    <table border="2" bgcolor="yellow">
      <tr>
        <th>Title</th>
        <th>Artist</th>
      </tr>
      <xsl:for-each select="CATALOG/CD">
      <tr>
        <td><xsl:value-of select="TITLE"/></td>
        <td><xsl:value-of select="ARTIST"/></td>
      </tr>
      </xsl:for-each>
    </table>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

スタイルシートをXML文書にリンクする

そして、XML文書にXSLスタイルシート参照を追加する。
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="cd_catalog.xsl"?>
<CATALOG>
  <CD>
    <TITLE>Empire Burlesque</TITLE>
    <ARTIST>Bob Dylan</ARTIST>
    <COUNTRY>USA</COUNTRY>
    <COMPANY>Columbia</COMPANY>
    <PRICE>10.90</PRICE>
    <YEAR>1985</YEAR>
  </CD>
.
.
.

XSL - テンプレート

XSLはXMLの出力の仕方を記述するためにテンプレートを使う。

CSSはルールを使う

私達のCSSスクールを勉強すると、CSSがHTML要素の出力を定義するために 1つ以上のルールを使っていることがわかる。1つのセレクタは ルールをHTML要素に関連付けるために使われる。 CSSにあるpセレクタは1つの<p>要素が1つのarialと名付けられた フォントを使って表示されるように話す。
p { font-family: arial }

XSLはテンプレートを使う

XSLはXML要素の出力の仕方を定義するためにテンプレートを使う。 一致属性はテンプレートをXML要素に関連づけるために使われる。 (一致属性はXML文書の全体のブランチのために1つのテンプレートを 定義するのにもまた使われる。) 前の章からXML CDカタログを出力するためのテンプレートを含む XSLスタイルシートを見よ。
<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
 <html>
 <body>
   <table border="1">
     <tr>
       <th>Title</th>
       <th>Artist</th>
     </tr>
     <tr>
       <td>.</td>
       <td>.</td>
     </tr>
   </table>
 </body>
 </html>
</xsl:template>
</xsl:stylesheet>
スタイルシートはそれ自身が1つのXML文書であるので、 その文書は<?xml version='1.0'?>から始まる。 xsl:stylesheetタグはスタイルシートの開始を定義する。 xsl:templateタグはテンプレートの開始を定義する。 テンプレート属性であるmatch="/"はテンプレートをXMLソース文書の ルート(/)に関連づけている(一致させている)。 最後の2つのラインを除いて、文書の残りはテンプレートそれ自身 を含む。 この変換の結果は次のように見える。
Title Artist
. .

<xsl:value-of> 要素

前の例題の結果は少々失望する。なぜならXML文書から出力へ コピーされるデータがないためである。 XSLの<xsl:value-of>要素はXML要素をXSL変換の 出力の流れの中に選択してゆくことができる。
<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
 <html>
 <body>
   <table border="1">
     <tr>
       <th>Title</th>
       <th>Artist</th>
     </tr>
     <tr>
      <td><xsl:value-of select="CATALOG/CD/TITLE"/></td>
      <td><xsl:value-of select="CATALOG/CD/ARTIST"/></td>
     </tr>
   </table>
 </body>
 </html>
</xsl:template>
</xsl:stylesheet>
選択属性値のための構文法はXSLパターンと呼ばれる。 それはファイルシステムにおいて'/'がサブディレクトリーを選択する のをナビゲートするように働く。 上記の変換の結果は次のように見える。
Title Artist
Empire Burlesque Bob Dylan

<xsl:for-each>要素

前の例題の結果もまた少々失望する。なぜなら たかだか1ラインのデータしかXML文書から出力にコピーされないからである。 XSLの<xsl:for-each>要素はすべてのXML要素をXSL変換の 出力の流れの中に選択してゆくことができる。
<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
  <html>
  <body>
    <table border="1">
      <tr>
        <th>Title</th>
        <th>Artist</th>
      </tr>
      <xsl:for-each select="CATALOG/CD">
      <tr>
        <td><xsl:value-of select="TITLE"/></td>
        <td><xsl:value-of select="ARTIST"/></td>
      </tr>
      </xsl:for-each>
    </table>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>
xsl:for-each要素はXML文書にある要素を位置付けて要素毎にテンプレートの パーツを繰り返す。 変換の結果は次のようになる。
Title Artist
Empire Burlesque Bob Dylan
Hide your heart Bonnie Tyler
Greatest Hits Dolly Parton
Still got the blues Gary More
Eros Eros Ramazzotti
One night only Bee Gees
Sylvias Mother Dr.Hook
Maggie May Rod Stewart
Romanza Andrea Bocelli
When a man loves a woman Percy Sledge
Black angel Savage Rose
1999 Grammy Nominees Many
For the good times Kenny Rogers
Big Willie style Will Smith
Tupelo Honey Van Morrison
Soulsville Jorn Hoel
The very best of Cat Stevens
Stop Sam Brown
Bridge of Spies T`Pau
Private Dancer Tina Turner
Midt om natten Kim Larsen
Pavarotti Gala Concert Luciano Pavarotti
The dock of the bay Otis Redding
Picture book Simply Red
Red The Communards
Unchain my heart Joe Cocker