2006 年 9 月 26 日 23 時 12 分

XSL #2: XSLT の枠組み


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


では、XSLT を書いてみよう。

XSLT は XML 適合文書なので、見た目は XML である。
では、XSLT の基本的な枠組みを作ってみる。
これは、XML を HTML に変換する例である。

========== default.xsl ==========
<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet
    version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>

    <xsl:output
        method="html"
        doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN"
        doctype-system="http://www.w3.org/TR/html4/loose.dtd"
    />

    <xsl:template match="/">
        <html>
            <head>
                <title>Test</title>
            </head>
            <body>
                <xsl:apply-templates />
            </body>
        </html>
    </xsl:template>

</xsl:stylesheet>
========== end of default.xsl ==========

XSLT も 普通の XML と同様、最初に XML 宣言が来る。

続いて、XSLT 文書が来るが、
XML 適合文書は必ずルート要素を 1 つ持たねばならない。
XSLT のルート要素は、stylesheet であり、
必須である version 属性を持つ。

    <xsl:stylesheet
        version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    >

さて、厳密な XML 文書の場合、
文書内で利用する要素などの文書型を、
xmlns 属性を使って宣言する。

XSLT では、XML を別の XML(や HTML 等)に変換するため、
変換先の XML の要素を文書内に直接記述することができる。
そのため、XSLT 文書では XSLT の要素と、
変換先の XML の要素が混在することが多い。

それらを全て混ぜると訳が分からなくなるため、
XSLT では、XSLT の要素に対しては要素名をそのまま使わず、
接頭辞を追加した修飾名で扱うのが一般的である。

修飾名とは、要素名に接頭辞をつけたものである。
XSLT では通常「xsl」の接頭辞を利用するため、
stylesheet 要素は、xsl:stylesheet という修飾名となる。

修飾の仕組みは XML 名前空間の規格で定められており、
接頭辞は、xmlns:~ という特殊な属性で示す。
xmlns:xsl="XLST の文書定義 URI" と記述することで、
XLST の要素を xsl の接頭辞で利用することを宣言する。

なお、XLST 文書定義を示す URI は、
http://www.w3.org/1999/XSL/Transform」である。

さて、通常は出力先として XML を使うので、
XLST で変換する際は、XLST の要素だけでなく、
xmlns="変換先文書定義の識別 URI" と指定することで、
変換先の要素を既定(接頭辞なし)として宣言する。

XSLT は、HTML や、明確な文書型定義を持たない XML を
出力できるように設計されているため、
xmlns を省略して自由に要素を書くこともできる。

今回は、変換先として HTML を使うことにしている。
そもそも HTML は、XML ではないため、
XML 用の文書定義 URI は存在しない。
つまり、この場合は xmlns は必ず省略する必要がある。

さて、ルート要素だけで長くなった。
続いて内容を見ていこう。
output 要素は、文書の出力形式を制御する。

    <xsl:output
        method="html"
        doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN"
        doctype-system="http://www.w3.org/TR/html4/loose.dtd"
    />

output 要素では、XML の変換手法を定義する。
method は出力の書式を決める。
通常は「xml」だが、WWW での利用を考慮し「html」もある。
HTML には、開きタグだけで記述する要素もあるため、
そういった HTML 形式に沿って書き出す為の指定である。

doctype-public や doctype-system は、
文書型宣言 <!DOCTYPE ~> を記述するためのものだ。
これを output 要素に指定しておくことで、
XSLT が変換して出力する際に追加してくれる。

HTML では文書型宣言が文書形式を示す唯一の方法なので、
HTML ではこの指定はほぼ必須といえる。
また、最近の Web ブラウザは、文書型宣言によって、
CSS の標準規格準拠モードをを切り替える機能があるので、
それを制御するためにも必要となる場合がある。

なお、上のような output によって、
以下のような文書型宣言が出力されることになる。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

template 要素は、実際の変換ルールを記述する。
template 要素 1 つが 1 つのルールを表す。

    <xsl:template match="/">
        <html>
            <head>
                <title>Test</title>
            </head>
            <body>
                <xsl:apply-templates />
            </body>
        </html>
    </xsl:template>

match 属性は、テンプレートを適用する
変換元文書の部分を指定するロケーションパスだ。
ロケーションパスは、XPath の構文を利用する。

match="/" はルートノード(要素ではない)を表すため、
このテンプレートは、XML 文書変換を行う際に、
一番最初に読み込まれることになる。

template 要素の内部には、
ロケーションパスに該当するノードが、
どのように変換されるかを記述する。

この例では、HTML 文書の本体が記述されている。
そのため、ルートノードは、
<html> や <head> などに変換されて出力される。

apply-templates 要素は、
再帰的にテンプレートを適用するためのものである。
現時点では、とりあえず指定するものだと思えばよい。

では、これを RSS に適用してみよう。
最近の Web ブラウザは、XSLT に対応しているため、
XML 文書の方に XSLT を関連付けておけば、
自動的に変換処理をして表示してくれる。

XSLT を関連付けるためには、
元の XML 文書に、xsl-stylesheet 処理命令を記述する。

例えば、RSS の場合は、以下のように記載すればよい。

    <?xml version="1.0" encoding="utf-8"?>
    <?xml-stylesheet type="text/xsl" href="default.xsl"?>
    <rss version="2.0">
    (以下省略)

では、上記に示した XLST を RSS に反映させて見よう。

http://loafer.jp/mixi/diary/rss.xsp?default.xsl

これは xsl-stylesheet 処理命令を追加したものだ。
昨日のように XML ツリーが表示されるのではなく、
テキストがずらずらと表示されたはずだ。

今日作ったテンプレートは、
最低限の変換ルールしか定めていないため、
ルート以外のノード(要素や属性など)には、
既定の処理が適用されている。

既定では、要素や属性は変換されず、
テキストはそのまま出力されるため、
このように、文字だけのデータとなったのである。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.