XSLT 2.0では、いくつかのスタイル・シートの機能が追加され、データを処理する能力が大幅に向上しています。XPath 2.0から得られる効果 (来月のコラムで取り上げます) 以外にも、XSLT 2.0を使用することによって多くの効果が得られます。以下のことが可能になります。
- ノードをグループ化する
- ユーザー定義関数を作成する
- 単一のスタイル・シートから複数の結果文書を作成する
これらの機能のそれぞれを詳しく見ていきましょう。
XSLT 1.0の最大の問題の1つは、その言語ではノード・グループに対して直接SELECT DISTINCT を実行できないことでした。この機能は、たとえば資料名ごとに著者名が示されたリスト (リスト1) を、著者名ごとに資料名が示された文書 (リスト2) に変換する場合に非常に便利です。
リスト1. 資料名と著者名
<book title="Professional XML">
<author name="Kevin Williams" />
<author name="A. Nother Author" />
</book>
<book title="XML Antipatterns">
<author name="Kevin Williams" />
</book>
<book title="XML for Managers">
<author name="A. Nother Author" />
<author name="Y. A. Author" />
</book>
|
リスト2. 著者名と資料名
<author name="A. Nother Author">
<book title="Professional XML" />
<book title="XML for Managers" />
</author>
<author name="Kevin Williams">
<book title="Professional XML" />
<book title="XML Antipatterns"/>
</author>
<author name="Y.A. Author">
<book title="XML for Managers" />
</author>
|
XSLT 1.0でもこの変換を行うことはできましたが、非常に複雑で不便な方法でした。それは、著者名のすべてのノードを選択して、それを名前ごとにソートし、さらにxsl:if ブロックを使用して、処理される著者名がそれまでに処理したノードと同じ名前かどうかを判別するという方法です。検出される著者名ごとに、コードは検索を行い、すべての資料要素に関するツリーを、その中に組み込まれている特定の著者名とともにバックアップする必要があります。この方法は確かに機能しますが、非常に使いにくい方法です。
XSLT 2.0では、xsl:for-each-group 要素が採用されています。この要素を使用すると、プログラマーは、一群のノードをいくつかの基準に基づいてグループ化し、そのような選択処理によって形成されたグループごとに処理することができます。この要素によって変換を簡単に行うことができます。
リスト3 にあるとおりです。
リスト3. xsl:for-each-group要素の例
<xsl:for-each-group
select="book/author"
group-by="author/@name">
<xsl:sort select="author/@name">
<author name="{current-group()/@name}">
<xsl:for-each select="current-group()">
<book title="{../@title}" />
</xsl:for-each>
</author>
</xsl:for-each-group>
|
XSLT 2.0では、新しくxsl:function 要素も採用されました。この要素を使用することによって、他のプログラミング言語の関数のように操作される関数を定義することができます。入力と出力を明示的に定義しておき、入力を処理して出力を生成します。関数をnamespace (通常、スタイル・シートに関連付けられるnamespace) 内で宣言すれば、XSLTの組み込み関数を呼び出すことができる位置 (たとえば、
xsl:value-of 要素のselect 属性内など) であればどこででも、新しく宣言した関数を呼び出すことができます。この関数は、
リスト4 のサンプルの階乗関数で示されているように、再帰的なアプリケーションと同じように機能します。
リスト4. xsl:functionを使用した階乗関数
<xsl:function name="local:factorial">
<xsl:param name="value" type="xsd:integer" />
<xsl:result select="if($value=1)
then 1
else $value * local:factorial($value - 1)" />
</xsl:function>
|
XSLT 1.0では、変換によって生成されるのは常に1つの出力文書です。XSLT 2.0では、単一のスタイル・シートから複数の結果文書を作成することができます。たとえば、フレームによって区切られたXHTML文書のすべてのフレームを作成したり、同じコンテンツを異なる形式で作成したりできます (たとえば、1つのスタイル・シートで、同じソースのHTML、XHTML、WML、およびVoiceML変換処理を作成できます)。変換処理によって作成される追加の文書には、それぞれURIが関連付けられます。URIの使用法は、アプリケーションごとに固有です (たとえば、ファイル・システムの特定の場所に2次文書を順番に並べるために使用する方法や、コードによって2次文書にアクセスするためにソフトウェアがXSLTプロセッサーを使用するための単なるメカニズムとして使用する方法などがあります)。 リスト5 は、1次文書と2つの2次文書を作成するための方法を示しています。
リスト5. XSLT 2.0コードを使用して追加の文書を生成する
<xsl:template match="/">
... primary output generation here ...
<xsd:result-document href="result.wml">
... generation of WML output here...
</xsd:result-document>
<xsd:result-document href="result.voiceml">
... generation of VoiceML output here...
</xsd:result-document>
</xsl:template>
|
XSLT 2.0の非常に重要な機能の1つは、特定の変換の出力をXHTMLとしてシリアライズするように指定できることです。出力を現在のブラウザーと互換性のあるものにするためには、シリアライゼーションにいくつかの特定のステップが必要です。特に以下のことを行う必要があります。
- 空要素では、空タグ (/>) マーカーの前にスペースを置く。
- 内容が空の要素では、必ず空タグの省略形 (<br />) を使用する。
- 空内容モデルではない要素が、空になってしまう場合、Elements that do not have an empty空タグの省略形は使用しない (<p /> ではなく <p></p> を使用する)。
- 属性内の非ASCII値は正しくエスケープする。
XSLT 2.0では、名前付きソート指定を作成することができます。この指定をXPath式内で使用して、データをソートすることができます。これにより、XPath内において任意のレベルで、ノードの任意のセットをソートすることが可能になります。たとえば、リスト6 は、まずリスト1 のサンプルXML文書の資料リストを資料名順にソートして、その後それを著者名順にソートしています。
リスト6. XPathのソート関数を使用する
<xsl:sort-key name="bookSort">
<xsl:sort select="@title" />
<xsl:sort select="author/@name" />
</xsl:sort>
<xsl:for-each select="sort('bookSort', book)">
... each book is processed, ordered by title and author name...
</xsl:for-each>
|
この記事では、XSLT 2.0に追加された重要な変更のいくつかを紹介しました。XPathのバージョン が1.0から2.0にアップすることに伴って追加される重要な変更については、次回の記事で紹介します。XSLT 2.0は依然ワーキング・ドラフトの段階にあるため、勧告案の段階に進むまでさらに変更が加えられる可能性があります。しかし、今から新しい機能について理解しておくなら、勧告となったときにXSLT 2.0の機能を十分に引き出せるようにシステムを設計しておくことができるでしょう。
-
XSLT およびXPath テクノロジーに関する優れた基礎知識は、W3Cから入手できます。
-
XSLT 2.0 にアクセスして、仕様およびW3Cワーキング・ドラフトの現在の状況を確認してください。
- Kevin Williams氏の以前の記事をお読みください。
- データ用のXML:XMLスキーマのアーキタイプを使用する (developerWorks 2001年6月)
- データ用のXML:スキーマによるスタイリング (developerWorks 2001年7月)
- データ用のXML:XLinkとデータ (developerWorks 2001年7月)
- データ用のXML:賢明なアーキテクチャーを実現するための4つのヒント (developerWorks 2001年8月)
- データ用のXML:多対多関係のモデル化 (developerWorks 2002年1月)
- データ用のXML:Queryの紹介 (developerWorks 2002年2月)
- データ用のXML:XSLスタイル・シート: プッシュ・スタイルかプル・スタイルか? (developerWorks 2002年3月)
- Soapbox: データ記述においてXML SchemaがDTDよりも優れている理由 (developerWorks 2001年6月) で、Kevinはデータ中心型XMLアプリケーション用としてXML Schemaを推奨しています。
- XML関連の多くの資料を、
developerWorksのXMLゾーンで調べることができます。
-
XMLおよびその関連テクノロジーのIBM Certified Developer になる方法をお調べください。
Kevin Wiliams氏は、情報管理システムのためのXML設計を専門とするVeridianの一部門であるEquientの主任XMLアーキテクトです。XMLに関する数冊の共著がWrox Pressから出版されています。彼の連絡先はkevin@realworldxml.comです。Kevin Williams氏のWebサイト www.realworldxml.com では、XMLについて彼が思うこと、ヒント、秘けつ、大胆な主張について知ることができます。