IBM®
本文へジャンプ
    Japan [変更]    ご利用条件
 
 
検索範囲検索:    
    ホーム    製品    サービス & ソリューション    サポート & ダウンロード    マイアカウント    
skip to main content

developerWorks Japan  >  XML | Web development  >

XSLT を使ってアプリケーションを国際化する

クライアント・サイドで国際化を行うための手順

developerWorks
ページオプション

JavaScript を要するドキュメントオプションは表示されません

サンプルコード

原文はこちら

原文はこちら


レベル: 初級

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 codex-clientxslti18n.zip3KBHTTP
ダウンロード形式について


参考文献

学ぶために
  • 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® などが提供するアプリケーション開発ツールやミドルウェア製品が含まれています。


議論するために


著者について

Photo of Leonida Gianfagna

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


Photo of Stefano Borghetti

Stefano Borghetti はコンピューター・サイエンスの学位を取得後、1 年間 ENEA Italian Research Center で働いた後 2000年に IBM に入社しました。彼は現在、IBM Tivoli Monitoring の分野でソフトウェア・エンジニアとしての業務を行っています。彼が関心を持っている分野は、Web 技術、視覚モデリングを使用したソフトウェアの分析と設計、ソフトウェアのパフォーマンスに関するエンジニアリングです。


Photo of  Antonio Perrone

Antonio Perrone は 1989年にイタリアの University of Bari を情報科学の優等学位で卒業しています。彼は 1990年に IBM に入社し、開発とサポートでのいくつかの業務を担当してきました。1996年からは IBM Tivoli 部門に在籍し、現在はネットワーク・パフォーマンス管理の分野でのアーキテクトです。彼が関心を持っている分野は、システム管理、パフォーマンスと可用性、ナレッジ表現、データ統合、トランザクションとプロセスのモデリング、そしてソフトウェア開発です。




記事の評価


サイト改善のため、ご意見をお寄せください。こちらのフォームからお願いいたします。



 


 


不充分・不完全である大変素晴らしい
 


この記事を共有する

del.icio.us del.icio.us newsing newsing FC2ブックマーク FC2ブックマーク
Choix! Choix! ニフティクリップ ニフティクリップ Yahoo!ブックマーク Yahoo!ブックマーク
MM/memo MM/memo CZブックマーク CZブックマーク livedoorクリップ livedoorクリップ
はてなブックマーク はてなブックマーク Buzzurl(バザール) Buzzurl(バザール)




上に戻る


    日本IBMについて プライバシー お問い合わせ