今日のレポート・アプリケーションでは、データ・ソースの違いにかかわらず、データのフォーマットを設定するために XML を多用します。もっと具体的に言えば、Web ベースのレポート・アプリケーションは、通常は XSL 変換を使うことで、そうした XML データをさまざまなクライアントに表示します。現在のレポート・システムでの標準的なフローを大まかに表現すると、レガシーのデータ・ソース > XML > XSLT > Web ブラウザー、というようになります。ここで、XSL 変換のステップは、サーバー・サイド、またはクライアント・サイド (ブラウザー) のいずれかで行えることに留意してください。このどちらを選択するかは、一般的には非機能要件に依存します。例えばリクエスト率が高いシステムでは、XSL 変換をクライアント・サイドに移すことでパフォーマンスとスケーラビリティーを改善できる可能性があります。XSL 変換の結果得られる Web ページは国際化する必要があります。しかしクライアントで XSL 変換を行う場合には、XSL 変換そのものの中で国際化を処理する必要があります。これはつまり、XSL 変換ではメッセージを動的に変換する必要があるということです。この記事では、この課題に対する一般的なソリューションを提案します。
ここで提案するソリューションは次のような要素で構成されています。
- XSLT によるクライアント・サイドでの変換
- 変換の際に使用できる言語 ID (例えば it_IT といった言語コードなど)
- UTF-8 フォーマットでの XML ディクショナリー (ファイルの命名規則には言語 ID が含まれている必要があります)
- XML ディクショナリーにアクセスするための、XSLT の document 関数
リスト 1 は dictionary_en.xml という名前の簡単な XML ディクショナリーの構造を定義しています。
リスト 1. XML ディクショナリー
<?xml version="1.0" encoding="utf-8"?>
<Dictionary xml:lang="en-US">
<Label ID="TITLE">
<LabelText>Title</LabelText>
</Label>
<Label ID="YEAR">
<LabelText>Year</LabelText>
</Label>
<Label ID="AUTHOR">
<LabelText>Author</LabelText>
</Label>
<Label ID="HEADER">
<LabelText>Library example</LabelText>
</Label>
</Dictionary>
|
このファイルには、国際化が必要なすべてのラベルとメッセージが含まれています。つまり各ラベルには、変換の中で参照される ID と、(国際化が必要な文字列が含まれる) LabelText という名前のフィールドがあります。ここで説明する方法では、言語の ID は変換対象の XML ファイルに含まれています。これはつまり、このフィールドが XML の中に含まれているかどうかをサーバーが判断するということです。例えばデータを要求しているブラウザーの優先言語で国際化したい場合には、サーバー・サイドで HTTP リクエスト・ヘッダーを読み取り、その言語 ID を検索し、そしてその言語 ID を XML に含めれば十分です。リスト 2 は、これから作業を行う対象となる XML を示しています。
リスト 2. XML による books データ
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="books.xsl"?>
<Books language="en">
<Book>
<Title>Being and Time</Title>
<Year>1927</Year>
<Author>Martin Heidegger</Author>
</Book>
<Book>
<Title>Shobogenzo</Title>
<Year>1231</Year>
<Author>Dogen Zenji</Author>
</Book>
</Books>
|
この情報をブラウザーに表示するために、リスト 3 に示す XSL 変換を使います。ここではクライアント・サイドでの変換を使用するため、XSLT とディクショナリーのどちらも、特定の URI で入手可能な HTTP リソースでなければなりません。
リスト 3. XSL 変換
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fn="http://www.w3.org/2005/02/xpath-functions">
<xsl:variable name="language" select="Books/@language" />
<xsl:variable name="dictionaryName">dictionary_<xsl:value-of
select="$language"/>.xml</xsl:variable>
<xsl:variable name="dictionary" select="document($dictionaryName)" />
<xsl:template match="Books">
<html>
<head><title>Library example</title></head>
<body>
<h1>Library example</h1>
<table border="1">
<tr bgcolor="#9acd32">
<th align="left">
Title
</th>
<th align="left">
Year
</th>
<th align="left">
Author
</th>
</tr>
<xsl:for-each select="Book">
<tr>
<td><xsl:value-of select="Title"/></td>
<td><xsl:value-of select="Year"/></td>
<td><xsl:value-of select="Author"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
|
この変換によって図 1 のような画面が表示されます。
図 1. 国際化を行わない場合の結果
この場合、まだラベルは国際化されていません。
リスト 4 は出力をイタリア語に国際化するために必要な変更を示しています。サーバー・サイドのアプリケーションは、この XSLT 参照を含む XML データのみを返しますが、その際、イタリア語のロケールを示すように言語の属性を変更します。
リスト 4. イタリア語のロケールを含む、XML による books データ
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="books.xsl"?>
<Books language="it">
<Book>
<Title>Being and Time</Title>
<Year>1927</Year>
<Author>Martin Heidegger</Author>
</Book>
<Book>
<Title>Shobogenzo</Title>
<Year>1231</Year>
<Author>Dogen Zenji</Author>
</Book>
</Books>
|
こうすることで、XSLT は必要な言語を XML から直接取得することができます。
リスト 5 に示すとおり、今度はこの XSLT を、次のように 3 つの異なる方法で強化します。
- 言語 ID を使ってディクショナリーの名前を作成します
- XSLT の document 関数を使ってこのディクショナリーにアクセスします
- 国際化が必要なラベルを XPath を使って置き換えます
リスト 5は、その結果 XSLT がどうなるかを示しています。
リスト 5. XSL 変換を使ってディクショナリーにアクセスする
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fn="http://www.w3.org/2005/02/xpath-functions">
<xsl:variable name="language" select="Books/@language" />
<xsl:variable name="dictionaryName">dictionary_<xsl:value-of
select="$language"/>.xml</xsl:variable>
<xsl:variable name="dictionary" select="document($dictionaryName)" />
<xsl:template match="Books">
<html>
<head><title>Library example</title></head>
<body>
<h1><xsl:value-of select="$dictionary//Label[@ID='HEADER']/LabelText" /></h1>
<table border="1">
<tr bgcolor="#9acd32">
<th align="left">
<xsl:value-of select="$dictionary//Label[@ID='TITLE']/LabelText" />
</th>
<th align="left">
<xsl:value-of select="$dictionary//Label[@ID='YEAR']/LabelText" />
</th>
<th align="left">
<xsl:value-of select="$dictionary//Label[@ID='AUTHOR']/LabelText" />
</th>
</tr>
<xsl:for-each select="Book">
<tr>
<td><xsl:value-of select="Title"/></td>
<td><xsl:value-of select="Year"/></td>
<td><xsl:value-of select="Author"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
|
リスト 6 はイタリア語のディクショナリー、dictionary_it.xml を示しています。
リスト 6. イタリア語のディクショナリー
<?xml version="1.0" encoding="utf-8"?>
<Dictionary xml:lang="en-US">
<Label ID="TITLE">
<LabelText>Titolo</LabelText>
</Label>
<Label ID="YEAR">
<LabelText>Anno</LabelText>
</Label>
<Label ID="AUTHOR">
<LabelText>Autore</LabelText>
</Label>
<Label ID="HEADER">
<LabelText>Esempio libreria</LabelText>
</Label>
</Dictionary>
|
この結果、図 2 のような画面が表示されます。
図 2. 国際化の結果
必要なディクショナリーや特定のラベルが利用できない場合には、デフォルトのディクショナリーの定義を使います。
この記事では、XSL 変換を使ってクライアント・サイドで XML コンテンツを国際化するためのソリューションを説明しました。サーバー・サイドでは何も作業が必要なく、国際化に使用する言語を XML 内に保存すればよいだけです。クライアントは XSLT の document 関数を使うことで XSL 変換の中で適切なディクショナリーを取得し、作業を完了します。
| 内容 | ファイル名 | サイズ | ダウンロード形式 |
|---|---|---|---|
| Example source code | x-clientxslti18n.zip | 3KB | HTTP |
学ぶために
- XSLT を分析し、また XSLT の概要を解説した記事「XSLTはどのような言語か」(Michael Kay 著、developerWorks、2005年4月) を読み、この言語の起源や得意なこと、なぜこの言語を使う必要があるのかを学んでください。
- 「XSLT スタイル・シートと XML ディクショナリーによる国際化対応」(Laura Menke 著、developerWorks、2001年4月) を読んでください。この記事では、国際化と、サイトのコンテンツが変化する場合に編集が必要なファイル数を最小限にとどめるための方法を、サーバー・サイドの手法を使って説明しています。
-
XSLT Tutorial を利用して、XSLT の基本と、XML 文書を XSLT を使って変換する方法の基本を学んでください。
- World Wide Web Consortium (W3C) が解説する XML 国際化のためのベスト・プラクィス、Best Practices for XML Internationalization を読んでください。
- XML および関連技術において IBM 認定技術者になる方法については、IBM XML certification を参照してください。
-
developerWorks の XML ゾーンは XML の技術ライブラリーとして、広範な話題を網羅した技術記事やヒント、チュートリアル、技術標準、IBM Redbook などを用意しています。
-
developerWorks technical events and webcasts で最新情報を入手してください。
-
テクノロジー・ブックストアには、この記事や他の技術的な話題に関する本が豊富に取り揃えられています。
-
developerWorks
podcasts では、ソフトウェア開発者のための興味深いインタビューや議論を聞くことができます。
製品や技術を入手するために
- developerWorks から直接ダウンロードできる IBM trial software を利用して皆さんの次期プロジェクトを構築してください。この中には DB2® や Lotus®、Rational®、Tivoli®、WebSphere® などが提供するアプリケーション開発ツールやミドルウェア製品が含まれています。
議論するために
-
XML zone discussion forums に参加してください。これらのフォーラムでは XML を中心に議論が行われています。
- この記事を読んだ後、developerWorks XML zone: Share your thoughts に皆さんのコメントや意見を投稿してください。XML ゾーンの編集者がこのフォーラムの司会をしており、皆さんからの意見を歓迎しています。
-
developerWorks blogs から developerWorks のコミュニティーに加わってください。

Leonida Gianfagna は理論物理学で博士号を取得後、2002年に IBM に入社しました。彼は現在 IBM Tivoli Monitoring のソフトウェア・エンジニアとして業務を行っています。彼が関心を持っている分野は、SOA (Service-Oriented Architecture)、ソフトウェアのパフォーマンスに関するエンジニアリング、量子計算などです。

