レベル: 初級 Leonida Gianfagna, PhD (Leonida.Gianfagna@it.ibm.com), Software engineer, IBM Dr. Stefano Borghetti (stefano_borghetti@it.ibm.com), Software engineer, IBM Dr. Antonio Perrone (antonio.perrone@it.ibm.com), Senior Software Engineer, IBM
2008年 5月 06日 世界中のユーザーの要求に対応するために、今日の Web アプリケーションにはしばしば国際化が求められます。この記事では、XSLT を使ってクライアント・サイドで国際化を行うための方法について説明します。このソリューションに必要なのは、国際化対象のデータとサーバーが保存するデータの両方に XML を使用するということのみです。
 |
頻繁に使用する頭字語
- UTF: Unicode Transformation Format
- URI: Universal Resource Identifier
- W3C: World Wide Web Consortium
- XML: Extensible Markup Language
- XSLT: Extensible Stylesheet Language Transformations
|
|
今日のレポート・アプリケーションでは、データ・ソースの違いにかかわらず、データのフォーマットを設定するために 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 |
|---|
参考文献 学ぶために
製品や技術を入手するために
- developerWorks から直接ダウンロードできる IBM trial software を利用して皆さんの次期プロジェクトを構築してください。この中には DB2® や Lotus®、Rational®、Tivoli®、WebSphere® などが提供するアプリケーション開発ツールやミドルウェア製品が含まれています。
議論するために
著者について  | 
|  | Leonida Gianfagna は理論物理学で博士号を取得後、2002年に IBM に入社しました。彼は現在 IBM Tivoli Monitoring のソフトウェア・エンジニアとして業務を行っています。彼が関心を持っている分野は、SOA (Service-Oriented Architecture)、ソフトウェアのパフォーマンスに関するエンジニアリング、量子計算などです。 |
 | 
|  | Stefano Borghetti はコンピューター・サイエンスの学位を取得後、1 年間 ENEA Italian Research Center で働いた後 2000年に IBM に入社しました。彼は現在、IBM Tivoli Monitoring の分野でソフトウェア・エンジニアとしての業務を行っています。彼が関心を持っている分野は、Web 技術、視覚モデリングを使用したソフトウェアの分析と設計、ソフトウェアのパフォーマンスに関するエンジニアリングです。 |
 | 
|  | Antonio Perrone は 1989年にイタリアの University of Bari を情報科学の優等学位で卒業しています。彼は 1990年に IBM に入社し、開発とサポートでのいくつかの業務を担当してきました。1996年からは IBM Tivoli 部門に在籍し、現在はネットワーク・パフォーマンス管理の分野でのアーキテクトです。彼が関心を持っている分野は、システム管理、パフォーマンスと可用性、ナレッジ表現、データ統合、トランザクションとプロセスのモデリング、そしてソフトウェア開発です。 |
記事の評価
|