本文へジャンプ

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


お客様が developerWorks に初めてサインインすると、プロフィールが作成されます。プロフィールで選択した情報は公開されますが、いつでもその情報を編集できます。お客様の姓名(非表示設定にしていない限り)とディスプレイ・ネームは、投稿するコンテンツと一緒に表示されます。

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

  • 閉じる [x]

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

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

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


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

  • 閉じる [x]

データ用のXML: XSLT 2.0の紹介

XSLT 2.0で計画されているいくつかの機能の概要

Kevin Williams (kevin@blueoxide.com), CEO, Blue Oxide Technologies, LLC
Kevin Wiliams氏は、情報管理システムのためのXML設計を専門とするVeridianの一部門であるEquientの主任XMLアーキテクトです。XMLに関する数冊の共著がWrox Pressから出版されています。彼の連絡先はkevin@realworldxml.comです。Kevin Williams氏のWebサイト www.realworldxml.com では、XMLについて彼が思うこと、ヒント、秘けつ、大胆な主張について知ることができます。

概要: この記事では、Kevin Williams氏がXSLT 2.0の最新のワーキング・ドラフトを紹介し、いくつかのサンプル・コードを使用して、この新しいXMLスタイル言語がどのように効果的に機能するかを示します。

日付:  2002年 7月 01日
レベル:  中級 この記事の原文:  英語
アクティビティー: 2733 ビュー
お気軽にご意見・ご感想をお寄せください: 


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>


XHTMLサポート

XSLT 2.0の非常に重要な機能の1つは、特定の変換の出力をXHTMLとしてシリアライズするように指定できることです。出力を現在のブラウザーと互換性のあるものにするためには、シリアライゼーションにいくつかの特定のステップが必要です。特に以下のことを行う必要があります。

  • 空要素では、空タグ (/>) マーカーの前にスペースを置く。
  • 内容が空の要素では、必ず空タグの省略形 (<br />) を使用する。
  • 空内容モデルではない要素が、空になってしまう場合、Elements that do not have an empty空タグの省略形は使用しない (<p /> ではなく <p></p> を使用する)。
  • 属性内の非ASCII値は正しくエスケープする。

XPath式内でのソート

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の機能を十分に引き出せるようにシステムを設計しておくことができるでしょう。


参考文献

著者について

Kevin Wiliams氏は、情報管理システムのためのXML設計を専門とするVeridianの一部門であるEquientの主任XMLアーキテクトです。XMLに関する数冊の共著がWrox Pressから出版されています。彼の連絡先はkevin@realworldxml.comです。Kevin Williams氏のWebサイト www.realworldxml.com では、XMLについて彼が思うこと、ヒント、秘けつ、大胆な主張について知ることができます。

不正使用の報告のヘルプ

不正使用の報告

ありがとうございます。 このエントリーは、モデレーターの注目フラグが設定されました。


不正使用の報告のヘルプ

不正使用の報告

不正使用の報告の送信に失敗しました。


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
ArticleID=243019
ArticleTitle=データ用のXML: XSLT 2.0の紹介
publish-date=07012002
author1-email=kevin@blueoxide.com
author1-email-cc=

タグ

Help
このタグで、My developerWorks のすべてのタイプのコンテンツを見つけるために検索フィールドを使用します。

スライダーバーを使用することで、より多く(少なく)タグを表示します。

人気のタグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するトップのタグを表示します。

マイ・タグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するお客様ご自身のタグを表示します。

このタグで、My developerWorks のすべてのタイプのコンテンツを見つけるために検索フィールドを使用します。人気のタグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するトップのタグを表示します。マイ・タグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するお客様ご自身のタグを表示します。