ヒント: XSLT の極意

XSLT を作成する際に自問すべき基本的な事項

XSLT のコーディングは尻込みしたくなる作業に思えるかもしれませんが、2 つの単純な質問に答えることができれば、あとはそれほど難しくありません。この記事で説明する単純な方法を使えば、10 分で今までよりもはるかに明確に XSLT の基本を理解することができます。

Doug Domeny, Senior Software Engineer, Freelance

Doug Domeny は、ブラウザー・ベースで多言語対応、ビジネス・ユーザー向けの XML エディターを、XSLT、W3C XML Schema、DHTML、JavaScript、jQuery、正規表現、CSS を使って開発した経験があります。彼はマサチューセッツ州 Wenham の Gordon College でコンピューター・サイエンスおよび数学の学位を取得しており、XLIFF (XML Localization Interchange File Format) や OAXAL (Open Architecture for XML Authoring and Localization) など、OASIS の技術委員会で長年委員を務めてきました。彼はソフトウェア・エンジニアとして業務を行う中で、ソフトウェア・エンジニアリングやアーキテクチャー、UI 設計、テクニカルライティングで高いスキルを身に付けています。



2011年 1月 11日

10 年前、XSLT が比較的新しいものであった頃、私は XSLT を理解しようと苦闘しました。XSLT はあまりにも使い方が難しく、デバッグするのも非常に困難でした。しかし XSLT の強力さと弱点、そしてもっと重要な点として、XSLT の基本的枠組み、さらにはいつどのように XSLT を使うのか、といったことを理解できるようになった今では、XSLT は使うのが楽しいお気に入りのツールになっています。XSLT に適したタスクに使用した場合、XSLT はスマートさ、そして際立つ強力さを発揮します。

よく使われる頭文字語

  • CSS: Cascading Style sheet
  • HTML: HyperText Markup Language
  • RSS: Really Simple Syndication
  • SQL: Structured Query Language
  • URL: Uniform Resource Locator
  • W3C: World Wide Web Consortium
  • XHTML: Extensible HyperText Markup Language
  • XML: Extensible Markup Language
  • XSLT: Extensible Stylesheet Language Transformations

皆さんはボルトからナットを外すためにハンマーとドライバーを使ったことがあるでしょうか。その場合にはドライバーの先を六角ナットの 1 つの角に当て、ドライバーの柄をハンマーで叩きます。そして六角ナットをねじって回します。回らない場合には、もっと強くハンマーで叩きます。今度はソケットレンチを渡されたとします。ソケットレンチはハンマーと少し似ていますが、実際のハンマーとして使おうとすると、ハンマーほど効果的ではありません。そこでハンマーとドライバーを使うのをやめ、ナットにソケットレンチをはめて回します。残念ながら、ソケットが大きすぎてナットに引っかかりません。皆さんは結局あきらめ、元どおりハンマーを使うことにします。

ソケットレンチを使う鍵は、パターン・マッチングです。ソケットはナットと合うものでなければなりません。ソケットレンチがナットと合えば、ボルトからナットを外すためにはソケットレンチの方がハンマーよりもはるかに強力です。XSLT もパターンに依存します。Java™ 言語や C# 言語が命令型言語であるのに対し、XSLT はパターン・マッチング言語です。XSLT がソケットレンチであるなら、命令型言語はハンマーです。どちらにも、それぞれの使い方があります。

XSLT はプログラミング言語

Web 開発では、非常に異なる言語をいくつかマスターする必要があります。第 1 に、当然ながらマークアップ言語の HTML を理解する必要があります。さらに、フロントエンドで使う CSS と JavaScript、PHP や Microsoft® ASP.NETなどのサーバー・スクリプト、そしてバックエンドで使う Java、C#、Microsoft Visual Basic.NET などの言語が加わります。最後に、データベース・レベルで SQL があります。SQL を理解していれば XSLT の習得は容易です。どちらも宣言型の言語だからです。

皆さんが大部分のプログラマーと同じであるなら、プログラマーとしてのキャリアを C++ などの命令型言語で始めたことでしょう。命令型言語はコマンドによってコーディングされ、関数がアクションを実行します。アクションの名前は「動詞 - 名詞」の形式になっています (例えば GetValueUpdateContactInfo など)。宣言型の言語では、コマンドを発行することは少なく、多くの場合は必要な出力を記述 (つまり宣言) します。表 1 では一般的なプログラミング言語のいくつかを命令型と宣言型に分類しています。

表 1. プログラミング言語のスタイル
命令型宣言型
手続き型オブジェクト指向型関数型論理型
C、PascalJava、C++LISP、XPathProlog、SQL、XSLT

XSLT の極意: パターン・マッチング

XSLT は XML を XML、HTML、またはプレーン・テキストに変換する宣言型言語です。変換は、入力される XML 内でパターン・マッチングをすることで行われます。この XML では、出力するコンテンツを持つテンプレートが選択されています。図 1 に示すように、重要な点はパターン・マッチングです。コマンドをコーディングする代わりに、パターンをコーディングします。一部のパターンは入力に一致し、他のパターンは出力に対するテンプレートとして機能します。

リスト 1<item> 要素と突き合わせるための単純な XSLT テンプレートを示しています。

リスト 1. XSLT テンプレートの例
<xsl:template match="item">
     <li><a href="{link}"><xsl:value-of select="title"/></a></li>
</xsl:template>

match 属性により、入力と突き合わせるためのパターン (この場合は <item> タグ) を指定します。<xsl:template> タグの間にあるマークアップは出力のためのテンプレートです。このテンプレートには、入力の値を置き換えるためのプレースホルダーがあります。リスト 1 の場合、<link> 要素の値によって href 属性の URLを指定し、また <title> 要素の値はハイパーリンクを付けて表示されるテキストです。

開発者の皆さんは、「RSS フィードをリンクの一覧として表示する」というような課題を与えられることがよくあります。図 1 は最終的な成果として考えられる表示の例です。

図 1. 描画された出力
描画されたリンクの一覧の HTML 出力

しかしここでコーディングを始めようとすると、サイズの合っていないソケットレンチを使う場合のような苛立たしい結果になります。作業を始める前には、以下の 2 つを自問する必要があります。

  • (入力として) 何があるのか。
  • (出力として) 何が必要なのか。

タスクの入力を判断する

入力に関する質問に答える場合には、以下の事項を考えます。

  • その XML はどんなものか。
  • どんな要素があるか。
  • どれが反復要素か。
  • どんな構造か。
  • どんな属性があるか。
  • どんな名前空間があるか。

図 2 は XML の構造の一般的な項目を示しています。

図 2. XML の一般的な項目
XML の要素は、属性を持つ場合がある開始タグと、子ノード、そして終了タグで構成されています。

入力される XML のサンプルを入手します。もし手に入るなら、スキーマも入手します。スキーマにより、XML 文書に含まれる可能性のあるすべてのタグと属性値、そして XML 文書の構造を、オプション要素と属性を含めて知ることができます。マッチング・パターンのコーディングや XSLT のテストとデバッグをするには、入力文書のサンプルは不可欠です。例えば、IBM® developerWorks® の技術ライブラリーの RSS フィードを考えてみてください (リスト 2)。

リスト 2. 入力 XML 文書の例
<?xml version="1.0"?> 
<rss version="2.0"> 
<channel> 
    <title>IBM developerWorks : Technical library</title> 
    <link>http://www.ibm.com/developerworks/</link> 
    <description>The latest content from IBM developerWorks</description> 
    <pubDate>27 Nov 2010 16:48:48 +0000</pubDate> 
    <language>en</language> 
    <copyright>Copyright 2004 IBM Corporation.</copyright> 
    <image> 
        <title>developerWorks</title> 
        <url>http://www.ibm.com/developerworks/i/dwlogo-small.gif</url> 
        <link>http://www.ibm.com/developerworks/</link> 
    </image> 

    <item> 
        <title><![CDATA[IBM Cognos Proven Practices: Enterprise Planning - 
User Lockdown in DB2]]></title> 

        <description><![CDATA[This document describes methods to limit 
database permission in DB2 for IBM Cognos Planning 8.]]></description> 

        <link><![CDATA[http://www.ibm.com/developerworks/data/
library/cognos/infrastructure/databases/page535.html?ca=drs-]]></link> 

        <pubDate>25 Nov 2010 05:00:00 +0000</pubDate> 
    </item> 

    <item> 
        <title><![CDATA[Monitoring in DB2 9.7, Part 2: Relational access to 
XML event monitor data in DB2 9.7]]></title> 

        <description><![CDATA[Learn how you can get relational access to 
the subset of monitor data that is captured in the form of an XML document 
by an activity or statistics event monitor in IBM DB2 for Linux, UNIX, and 
Windows Version 9.7 (DB2).]]></description> 

        <link><![CDATA[http://www.ibm.com/developerworks/data/
library/techarticle/dm-1011db2mpart2/index.html?ca=drs-]]></link> 

        <pubDate>24 Nov 2010 05:00:00 +0000</pubDate> 
    </item> 

</channel> 
</rss>

出力を決定する

入力の内容を十分に把握できたら、今度は最終的な出力をどのようにするかを考えます。そのために以下の内容を自問してみます。

  • 出力フォーマットをどれにするか (XML、HTM、テキスト)。
  • タグの名前と属性を何にするか。
  • どんな構造にするか。

XSLT により、1 つまたは複数の XML 文書を以下のいずれかのフォーマットに変換することができます。

  • HTML
  • 異なる語彙を使用する XML
  • 同じ語彙を使用する XML (Identity テンプレートを使用します)
  • XHTML (特別に考慮された XML)
  • XSLT (XSLT は XML の語彙ですが、名前空間のエイリアスを使う必要があります)
  • テキスト (例えば JavaScript など)

出力マークアップを設計する際には、どのような表示にするかを最初に考え、次のステップとしてマークアップを作成します。例えば、リスト 3 はハイパーリンクの一覧に対する HTML マークアップを示しています。

リスト 3. 目標とする出力
<html>
    <head><title>the title</title></head>
    <body>
        <ul>
            <li><a href="some-url">hyperlink text</a></li>
            <li><a href="some-url">hyperlink text</a></li>
        </ul>
    </body>
</html>

XSLT を作成する

入力と出力に関する質問への回答が終わると、XSLT を作成する準備が整ったことになります。これまで一般的なプログラミング言語での作業がほとんどだった人は、「よし、まず見出しを作成し、for ループでリストを生成し、次にフッターを作成すればよい」と考えてしまいがちかもしれませんが、そのように考える代わりに、パターンで考える必要があります。入力の <item> 要素は出力の <li> 要素に対応します。各 <item> の中で、<link> 要素は <a href> に対応し、<title> 要素は <a> タグの間にあるテキストに対応します。これで XSLT を作成する準備が整ったので、以下のステップを実行します。

  1. 出力は HTML なので、<xsl:output> 要素を含めることで HTML を指定します。
  2. ルート・テンプレート (つまり <xsl:template match="/">) を追加し、ヘッダーとフッターの両方を含めて HTML 文書のパターンを追加します。
  3. リストを配置する場所に <xsl:apply-templates> 要素を配置します。
  4. <item> 要素が出力の <li> 要素に対応するようにテンプレートをコーディングします。

リスト 4 は完全な XSLT を示しています。

リスト 4. 完全な XSLT
<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="html"/>

<xsl:template match="/">
     <html>
          <head><title>Zen of XSLT</title></head>
          <body>
               <ul>
                    <xsl:apply-templates select="rss/channel/item"/>
               </ul>
          </body>
     </html>
</xsl:template>

<xsl:template match="item">
     <li><a href="{link}"><xsl:value-of select="title"/></a></li>
</xsl:template>

<xsl:template match="text()"/>

</xsl:stylesheet>

重要な点を忘れないこと

XSLT のコーディングをする上で重要なことは、関数を呼び出すのではなく、パターン・マッチングとして考えることです。そのためには以下の 2 つの重要な質問に答える必要があります。

  • (入力として) 何があるのか。
  • (出力として) 何が必要なのか。

この 2 つの質問に答えられると、入力と出力とを対応させる XSLT テンプレートを作成することができます。この 2 つの質問に答えないまま作業を進めると、ハンマー代わりにソケットレンチでドライバーの柄を叩くという方法で、ナットからボルトを緩めるかのような思いをする羽目になります。

参考文献

学ぶために

製品や技術を入手するために

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=XML, Web development
ArticleID=621421
ArticleTitle=ヒント: XSLT の極意
publish-date=01112011