14 TransX Utilityの使用

TransX Utilityを使用してXMLデータをデータベースに転送する方法について説明します。

トピック:

14.1 TransX Utilityの概要

TransX Utilityについて説明します。

TransX Utilityを使用すると、XMLデータをデータベースに転送できます。TransXは翻訳済のシード・データおよびメッセージをデータベース・スキーマにロードするXML SQL Utility(XSU)のアプリケーションです。

TransXは、多言語Extensible Markup Language (XML)を処理する場合に特に有用です。TransXを使用すると、複数の言語でデータをデータベースに追加できます。ユーティリティは次のことを行います。

  • 変数の変更、開始順序、および複数の挿入操作またはセッションを必要とするその他のStructured Query Language (SQL)文を自動的に管理します。したがって、翻訳ベンダーは、不慣れなSQLやProcedural Language/Structured Query Language (PL/SQL)スクリプトを扱う必要がありません。

  • 文字エンコーディングを自動化します。したがって、データ・ファイルがXML標準に準拠している場合、不適切なエンコーディングによるロード時のエラーは発生しません。

  • 翻訳する文字列を準備し、翻訳し、データベースにロードすることで、グローバリゼーションのコストを削減します。

  • 翻訳データ形式エラーを最小限に抑え、データベース内の事前に指定された場所に翻訳コンテンツを正確にロードします。データが事前定義済の形式であるとき、TransX Utilityはその形式を検証します。

  • 様々なグローバリゼーション・サポートの設定による構文エラーが発生しません。

  • ピース単位のNCHARデータに対するUNISTRコンストラクタは不要です。

注意:

TransXは認証されたユーザーとして実行されます。注意深くデータ・ファイルをレビューして、信頼されたソースからのみデータ・ファイルをロードしてください。

トピック:

14.1.1 TransX Utilityの使用の前提条件

TransX Utilityの使用の前提条件について説明します。

TransXはXSUのアプリケーションであるため、この章ではXML SQL Utility(XSU)を十分理解していることを前提とします。

14.1.2 TransX Utilityの機能

このトピックでは、多言語データ・ロードの簡略化、簡易データ形式のサポート、およびその他のTransX Utilityの機能について説明します。

トピック:

14.1.2.1 多言語データ・ロードの簡略化

従来の翻訳データのロード方法では、ロードするファイルを切り替えるときに環境変数NLS_LANGを変更していました。これにより、クライアント・アプリケーションとデータベース・サーバーで使用される言語および地域が設定されます。また、クライアント・プログラムによって入力または表示されるデータで使用される、クライアントの文字セットも設定されます。

多言語データまたはデータの翻訳をデータベースに挿入またはエンコードする場合は、各XMLファイルを検証する必要があります。

従来の方法では、各ロード・ファイルは、それぞれの言語に適したキャラクタ・セットでエンコードされます。翻訳は、元のファイルと同じファイル形式(通常はSQLスクリプト)で実行する必要があるため、この操作が必要でした。NLS_LANGの設定は、ファイルが言語に対応したキャラクタ・セットに適した形でロードされると同時に変更されます。この方法は、時間がかかるだけでなく、エンコーディング・メタデータがデータ自体と区別されるため、エラーが発生しやすくなります。

TransX Utilityでは、データセットと呼ばれる事前定義済の形式を持つXML文書を使用します。データセットにはエンコーディング情報およびデータが含まれ、NLS_LANGの設定を変更せずに多言語データを転送できます。TransX Utilityを使用すると、開発グループおよび翻訳グループは、データベースへのXMLデータのロード時に正しいキャラクタ・セットを維持する必要がなくなります。

関連項目:

NLS_LANG環境変数の詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください

14.1.2.2 簡易データ形式のサポートおよびインタフェース

TransX Utilityには、コマンドライン・インタフェースおよびプログラム可能なアプリケーション・プログラミング・インタフェース(API)があります。このユーティリティは、データベースにロードされるシード・データを表す正規の方法であるデータ形式に準拠します。この形式は、わかりやすく、翻訳グループ用に簡略化されています。

フォーマット仕様は、データのロードを可能にするための、翻訳者によるデータの記述方法を定義します。データセットの値は、スカラー値で表現するか、定数、順序および問合せなどの式を使用して表現できます。

14.1.2.3 その他のTransX Utilityの機能

その他の有用なTransX Utility機能について説明します。

表14-1 TransX Utilityの機能

機能 TransX Utility . . .

コマンドライン・インタフェース

簡単に使用できるコマンドを提供します。

ユーザーAPI

Java APIが表示されます。

検証

データ形式を検証し、エラーを報告します。

空白の処理

特に指定されていないかぎり、データセットに含まれる空白文字は有意とみなされません。

アンロード

入力された問合せに基づいて、結果を標準データ形式にエクスポートします。

翻訳交換フォーマットとの親和性

翻訳交換フォーマットとの間で変換を行うことができます。

ローカライズされたユーザー・インタフェース

多数の言語でメッセージを表示します。

14.2 TransX Utilityの使用: 概要

このトピックでは、TransX Utilityの使用方法について説明します。

トピック:

14.2.1 TransX Utilityの使用: 基本プロセス

TransX APIの基本プロセスについて説明します。

TransXは次のAPIを介してアクセスできます。

  • oracle.xml.transx.loaderクラス: このクラスには、TransXインスタンスを取得するためのgetLoader()があります。

  • oracle.xml.transx.TransXインタフェース: TransXのAPIです。

図14-1に、TransX APIを使用してXMLをデータベースに転送するための基本プロセスを示します。

図14-1 TransXアプリケーションの基本プロセス

図14-1の説明が続きます
「図14-1 TransXアプリケーションの基本プロセス」の説明

TransXアプリケーションの基本プロセスは、次のとおりです。

  1. TransXローダー・オブジェクトを作成します。 getLoader()を起動することにより、TransXクラスをインスタンス化します。
    TransX  transx = loader.getLoader();
    
  2. TransX.open()を使用してデータベース接続情報を指定して、データ・ロード・セッションを開始します。セッションを作成するには、Java Database Connectivity (JDBC)接続文字列、データベース・ユーザー名およびデータベース・パスワードを指定します。次のいずれかの方法で接続を作成できます。
    • JDBC Oracle Call Interface (OCI)ドライバの使用。この方法を示す次のコード部分は、指定されたユーザー名とパスワードを使用して接続します。

      transx.open( "jdbc:oracle:oci8:@", user, passwd );
      
    • JDBCシン・ドライバを使用します。シン・ドライバはPure Javaで作成されており、すべてのJavaプログラムからコールできます。次のコード部分は、この方法を示して接続します。

      transx.open( "jdbc:oracle:thin:@//myhost:1521/myservicename", user,passwd); 
      

      シン・ドライバにはホスト名(myhost)、ポート番号(1521)およびサービス名(myservicename)が必要です。データベースにアクティブなTransmission Control Protocol/Internet Protocol (TCP/IP)リスナーが必要です。

    注意:

    検証はTransXによって実行されるため、データ形式の検証のみを行う場合はデータベース接続を確立する必要はありません。この場合は、先行するopen()を起動せずにTransX.validate()メソッドを起動できます。

  3. TransXローダーを構成します。表14-2に、構成メソッドを示します。

    表14-2 TransXの構成メソッド

    メソッド 説明

    setLoadingMode()

    重複に対する操作モードを設定します。このモードは、データベース内の1つ以上の既存の行で、キー列の値がロードされるデータセットの値と同じであった場合のTransXの動作を決定します。oracle.xml.transx.LoadingModeクラスの定数EXCEPTION_ON_DUPLICATESSKIP_DUPLICATESまたはUPDATE_DUPLICATESを指定できます。デフォルトでは、ローダーは重複をスキップします。

    setNormalizeLangTag()

    言語タグを大文字または小文字に設定します。デフォルトで、ローダーはデータ・ローディング・フォーマット(DLF)のnormalize-langtag属性で指定されたスタイルを使用します。

    setPreserveWhitespace()

    ローダーでの空白の処理方法を指定します。デフォルトはFALSEです。この場合、ローダーはデータセット内の空白文字の種類を無視し、空白文字としてロードします。ローダーは、データセット内の連続する空白文字を1つの空白文字として処理します。

    setValidationMode()

    検証モードを設定します。デフォルトはTRUEです。この場合、load()の起動のたびにローダーは正規のスキーマ定義と照合してデータセット形式の検証を実行します。データセットがすでに検証済である場合にのみ検証モードを無効にします。

    次の例は、ローダーが重複する行をスキップし、データセットを検証しないことを指定します。

    transx.setLoadingMode( LoadingMode.SKIP_DUPLICATES ); 
    transx.setValidationMode( false ); 
    
  4. TransX.load()を起動してデータセットをロードします。ロード操作の反復中は同じJDBC接続を使用します。たとえば、次のように3つのデータセットをロードします。
    String  datasrc[] = {"data1.xml", "data2.xml", "data3.xml"}; 
    ...
    for ( int i = 0 ; i < datasrc.length ; i++ ) 
    { 
      transx.load( datasrc[i] ); 
    } 
    
  5. TransX.close()を起動してロード・セッションをクローズします。このメソッドの起動によってデータベース接続をクローズします。
    transx.close();

    関連項目:

14.2.2 TransX Utilityのデモ・プログラムの実行

TransX Utilityのデモ・プログラムは、$ORACLE_HOME/xdk/demo/java/transxにあります。

表14-3に、このユーティリティのテストに使用できるXMLファイルとプログラムを示します。

表14-3 TransX Utilityのサンプル・ファイル

ファイル 説明

README

TransXのデモの設定方法が記述されたテキスト・ファイル。

emp-dlf.xml

サンプル出力ファイル。次のコマンドは、emp表のすべてのデータを含むemp.xmlファイルを生成します。

transx -s "jdbc:oracle:thin:@//myhost:1521/myservicename" user
 -pw emp.xml emp

emp-dlf.xmlファイルはemp.xmlと同一である必要があります。

txclean.sql

デモのために作成された表および順序を削除するSQLファイル。

txdemo1.java

JDBC接続を作成し、データベースに3つのデータセットをロードするサンプルJavaアプリケーション。

txdemo1.sql

デモ・アプリケーションで使用する2つの表および順序を作成するSQLスクリプト。

txdemo1.xml

サンプル・データセット。

サンプル・プログラムのコンパイル方法および実行方法は、READMEに示されています。この場合、基本的な手順は次のようになります。

  1. ディレクトリを$ORACLE_HOME/xdk/demo/java/transxディレクトリ(UNIXの場合)または%ORACLE_HOME%\xdk\demo\java\transxディレクトリ(Windowsの場合)に変更します。
  2. 「XDK for Java環境の設定」の説明に従って、環境変数が設定されていることを確認します。環境変数$ORACLE_SID (UNIXの場合)または%ORACLE_SID% (Windowsの場合)をデフォルト・データベースに設定することをお薦めします。

    注意:

    セキュリティ上の理由から、コマンドライン・インタフェースにパスワードが表示されないようにしてください。TransXでパスワードのかわりに「-pw」と指定すると、[ Enter password : ]と表示されてパスワードの入力を求められます。ユーザーがパスワードを入力してもパスワードがそのまま表示されることはなく、文字数分の「*」が表示されます。

  3. txdemo1.sqlを実行して、サンプル・データベース・オブジェクトを設定します。データベースに接続し、次のようにtxdemo1.sqlスクリプトを実行します。
    @txdemo1
    
  4. コマンドラインからTransXユーティリティを実行します。この例では、ホストがmyhost、ポートが1521、サービス名がmyservicenameの場合に、シンJavaドライバに接続する方法を示します。トークンuserで示している場所にユーザー名を入力します。次のコマンドを実行して、データセットtxdemo1.xmlをロードできます。
    transx "jdbc:oracle:thin:@//myhost:1521/myservicename" user -pw txdemo1.xml
    

    操作が正常に実行された場合、端末への出力はありません。

  5. データベースを問い合せて、ロードが正常に実行されたかどうかを確認します。次に例を示します。
    SELECT * FROM i18n_messages;
    
  6. デモ・オブジェクトを削除して、別のテストの準備をします。データベースに接続し、次のようにtxclean.sqlスクリプトを実行します。
    @txclean
    
  7. Javaのデモ・プログラムをコンパイルします。次に例を示します。
    javac txdemo1.java
    
  8. コマンドライン・インタフェースを起動したときに使用したのと同じJDBCおよびデータベース接続データを使用して、Javaプログラムを実行します。次に例を示します。
    java txdemo1 "jdbc:oracle:thin:@//myhost:1521/myservicename" user -pw\
                  txdemo1.xml
    

    前述と同じ問合せテスト(手順5)およびクリーンアップ操作(手順6)を実行します。

  9. TransX Utilityを実行して、事前定義済のXML形式にデータをアンロードします。次に例を示します。
    transx -s "jdbc:oracle:thin:@//myhost:1521/myservicename" user -pw emp.xml emp
    

    emp.xmlのデータをemp-dlf.xmlと比較します。

    注意:

    この機能を簡単に説明するために、この例では、デプロイされたシステムで通常使用されるパスワード管理手法を実行していません。本番環境では、Oracle Databaseのパスワード管理ガイドラインに従い、サンプル・アカウントを無効にしてください。パスワード管理ガイドラインおよび他のセキュリティに関する推奨事項は、Oracle Databaseセキュリティ・ガイドを参照してください。

14.2.3 TransXコマンドライン・ユーティリティの使用

TransX Utilityは、Oracle Databaseにパッケージ化されています。デフォルトでは、Oracle Universal Installerを使用してディスク上にユーティリティがインストールされます。

「XDK for Javaコンポーネントの依存性」で説明しているように、TransXライブラリは$ORACLE_HOME/lib/xml.jar (UNIXの場合)および%ORACLE_HOME%\lib\xml.jar (Windowsの場合)です。

次の構文を使用して、オペレーティング・システムのコマンドラインからTransX Utilityを実行できます。

java oracle.xml.transx.loader

Oracle XML Developer's Kit (XDK)には、$ORACLE_HOME/bin/transx(UNIXの場合)および%ORACLE_HOME%\bin\transx.bat(Windowsの場合)というTransXのスクリプト・バージョンが含まれます。PATH変数が正しく設定されている場合、次のようにTransXを実行できます。

transx options parameters
transx.bat options parameters

たとえば、次のコマンドは有効な構文です。

transx -s "jdbc:oracle:thin:@//myhost:1521/myservicename" user -pw emp.xml emp

トピック:

14.2.3.1 TransX Utilityのコマンドライン・オプション

TransX Utilityのコマンドライン・オプションについて説明します。

表14-4 TransX Utilityのコマンドライン・オプション

オプション 意味 説明
-u 

既存の行を更新します。

既存の行をスキップせず、更新します。更新操作の対象から列を除外するには、useforupdate属性をnoに設定します。

-e 

特定の行がデータベースにすでに存在する場合に例外を戻します。

重複行が検出されると例外を発生させます。デフォルトでは、TransXは重複行をスキップします。データベースおよびデータセットの検索キー列(複数可)の値が同じ場合は、行が重複しているとみなします。

-x 

データベースのデータを、事前定義済の形式で出力します。

-sオプションと同様に、ユーティリティがロードと逆の操作を実行します。ただし、-sオプションとは異なり、stdoutに出力します。この出力をファイルにリダイレクトする方法はお薦めしません。オペレーティング・システムの介入によって、予想外のトランスコーディングが発生してデータが失われる可能性があります。

-s

データベースのデータを、事前定義済の形式でファイルに保存します。

アンロードを実行します。TransX Utilityはデータベースへの問合せを行って、その結果を事前定義済のXML形式にフォーマットし、指定したファイル名で格納します。

-p

ロードするXMLを出力します。

挿入するデータセットを正規のXSU形式で出力します。

-t

更新のためXMLを出力します。

更新するデータセットを正規のXSU形式で出力します。

-o

検証を省略します(デフォルトでは、データセットは解析時に検証されます)。

TransX Utilityが形式の検証(デフォルトでは実行される)をスキップします。

-v

データ形式を検証し、ロードせずに終了します。

TransX Utilityが検証を行って終了します。

-w

空白を保持します。

TransX Utilityが空白文字(\t、\r、\n、' 'など)を有意であるとみなします。文字列データ要素内の連続する空白文字は、デフォルトでは1つの空白文字に圧縮されます。

-l

言語タグを大文字または小文字に設定します。

TransX UtilityはDLFのnormalize-langtag属性またはTransX APIのsetNormalizeLangTag()メソッドで指定された言語タグの大文字/小文字正規化スタイルをオーバーライドします。有効なオプションは、標準、大文字および小文字に対してそれぞれ-ls-luおよび-llです。

コマンドライン・オプションの例外は次のとおりです。

  • -u-eは、相互に排他的です。

  • -vは、次の例に示すとおり、後にデータを伴う唯一のオプションです。

  • -xは、次の例に示すとおり、後に接続情報およびSQL問合せを伴う唯一のオプションです。

すべての引数を省略すると、表14-4に示した使用方法の情報が表示されます。

14.2.3.2 TransX Utilityコマンドライン・パラメータ

TransX Utilityのコマンドライン・パラメータについて説明します。

表14-5 TransXユーティリティのコマンドライン・パラメータ

パラメータ 説明
connect_string 

JDBC接続文字列。『Oracle Database JDBC開発者ガイド』を参照してください。

username 

データベース・ユーザー名(スキーマ)。

password 

データベース・ユーザーのパスワード、または「-pw」。

datasource 

ファイル名またはURLで指定されたXML文書。

options

表14-4を参照してください。

関連項目:

TransXインタフェースの詳細は、Oracle Database XML Java APIリファレンスを参照してください

14.3 TransX Utilityを使用したデータのロード

Oracle TransX Utilityを使用して、多言語のデータをデータベースに移入できます。データベース・スキーマとの間でデータを送受信するには、このスキーマにマップするデータセットを作成します。TransXを使用してデータベースの翻訳済アプリケーション・メッセージを整理するシナリオについて説明します。

トピック:

14.3.1 データベースへのメッセージの格納

データが特定の地域に固有のもので、共通の言語および文化的慣習を共有する場合は、ロケール固有の情報を取得できるリソース管理機能を使用してデータを編成する必要があります。多くの場合は、メンテナンスが簡単で柔軟性が高いため、データベースを使用してこのようなデータを格納します。

国際化されたシステムを構築するには、ローカライズ可能なリソースをビジネス・ロジックから切り離すことが不可欠です。このようなリソースの一般的な例として翻訳済のテキスト情報があります。

例14-1のような構造およびコンテンツを持つ表を作成し、データを挿入するとします。

エンド・ユーザーの優先言語に基づいてアプリケーションでメッセージを取得できるように、この表では列language_idが定義されています。この列には、メッセージの言語を識別するための言語名の略称が含まれます。

例14-2に、表のサンプル・データを示します。

関連項目:

Oracleの言語の略称は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください

例14-1 表translated_messagesの構造

CREATE TABLE translated_messages
(
  MESSAGE_ID       NUMBER(4)
     CONSTRAINT tm_mess_id_nn NOT NULL
, LANGUAGE_ID      VARCHAR2(42)
, MESSAGE          VARCHAR2(200)
);

例14-2 translated_messagesの問合せ

MESSAGE_ID  LANGUAGE_ID  MESSAGE
----------  -----------  ----------------------------------
1           us           Welcome to System X
2           us           Please enter username and password

14.3.2 事前定義済形式でのデータセットの作成

次の例は、translated_messages表を表すXML文書を示しています。

「データ・ローディング・フォーマット(DLF)仕様」では、DLF言語の構文について詳しく説明しています。この言語を使用して、TransXへの入力を提供するDLF文書を作成します。

正規の形式でデータセット(入力データ)を指定すると、そのデータは、TransX Utilityによってデータベース内の指定された場所にロードされます。TransXは、データベース・オブジェクトを作成しません。したがって、データをロードする前に、表またはビューを作成する必要があります。

例14-3に、例14-1で作成したtranslated_messages表を表すXML文書を示します。データセットは、この例ではtranslated_messagesというターゲット表の構造を反映しています。

例14-3 example.xml

<?xml version="1.0"?>
<table name="translated_messages">
  <!-- Specify the unique identifier --> 
  <lookup-key>
    <column name="message_id" />
    <column name="language_id" />
  </lookup-key>
  <!-- Specify the columns into which data will be inserted -->  
  <columns>
    <column name="message_id"  type="number"/>
    <column name="language_id" type="string" constant="us" translate="yes"/>
    <column name="message"     type="string" translate="yes"/>
  </columns>
  <!-- Specify the data to be inserted -->
  <dataset>
    <row>
      <col name="message_id">1</col>
      <col name="message" translation-note="dnt'X'">Welcome to System X</col>
    </row>
    <row>
      <col name="message_id">2</col>
      <col name="message">Please enter username and password</col>
    </row>
    <!-- ... -->
  </dataset> 
</table> 

トピック:

14.3.2.1 入力XML文書の形式

入力XML文書の形式について説明します。

例14-3のXML文書は、次のような宣言で開始します。

<?xml version="1.0"?>

ルート要素の<table>は、表名を指定する属性を持ち、他のすべての要素を囲みます。

<table name="translated_messages">
...
</table>

「DLFの要素」で説明しているように、<table>要素には3つのサブセクションがあります。

前述のセクションは、次のように例14-3の要素にマップします。

<lookup-key>...</lookup-key>
<columns>...</columns>
<dataset>...</dataset>

検索キーは、行がすでにデータベースに存在する場合、行を評価するために使用する列です。メッセージと言語識別子の対によって一意の文字列を識別する必要があるため、文書で対応する列をリストします。この場合、表translated_messagesmessage_idlanguage_idおよびmessage列は、次のように<column>要素の属性にマップされます。

<column name="message_id"  type="number"/>
<column name="language_id" type="string" constant="us" translate="yes"/>
<column name="message"     type="string" translate="yes"/>

列セクションは、データセット・セクションのデータ・ピースと表列のマッピングを指定するため、表構造をミラー化する必要があります。列名は、XMLデータセットおよびデータベースの全体を通じて一貫している必要があります。表14-6<column>属性を使用して、ロードするデータを記述できます。これらの属性は、「DLFの要素」で説明しているDLF属性のサブセットです。

表14-6 <column>の属性

属性 説明

type

データセットの列のデータ型を指定します。この属性は、データセットの<col>要素に含まれるテキストの種類を指定します。この型に応じて、データ・ロード・ツールはデータに対して異なるデータ型の規則を適用します。

<column name="col" type="string" />

constant

定数値を指定します。各行に固定値を持つ列では、同じ値を繰り返す必要はありません。

<column name="col" type="string" constant="us" />

language

language属性は、列が言語タグを格納する言語列であることを示します。constant属性と同様に機能します。ただし、列を宣言するロールは言語列です。

<column name="language" type="string" language="us" />

sequence

この列に値を入力するために使用されるデータベース内の順序を指定します。

<column name="id" type="number" sequence="id_sq" />

translate

この列またはパラメータのテキストを翻訳するかどうかを指定します。

<column name="msg" type="string" translate="yes"/>

<column>要素のconstant属性は、<dataset>セクション内のすべての行の対応する列に格納する値を指定します。この例では元の言語を使用しているため、language_id列は値usに設定されています。

言語列の定義

別の方法として、language_id列で、constant属性でなくlanguage属性を使用することもできます。language属性を持つDLFドキュメントでは、XML名前空間でlang属性を使用できます。言語列では、プレースホルダ「%x」を使用して、ルート表要素の標準のxml:lang属性から値を取得できます。このためtranslate="yes"は不要です。値「%x」は変換する必要がありません。このDLFのロード結果は例10-3と同じです。

表15-10で説明しているように、type属性の有効な値はstringnumberdateおよびdateTimeです。これらの値はXMLスキーマ標準で定義されたデータ型に対応しているため、各データ・ピースはそれぞれのデータ型の定義に準拠する必要があります。特に、表14-7に示すようにdateおよびdateTimeデータ型にInternational Organization for Standardization (ISO) 8601形式を使用することが重要です。

表14-7 dateおよびdateTimeの形式

データ型 形式

date

CCYY-MM-DD

2009-05-20

dateTime

CCYY-MM-DDThh:mm:ss

2009-05-20T16:01:37

例14-5に、TransXデータセットのdateTimeデータを持つ表の行の表現方法を示します。

例14-4 language属性を持つexample.xml

<?xml version="1.0"?>
<table xml:lang="us" name="translated_messages">
  <!-- Specify the unique identifier --> 
  <lookup-key>
    <column name="message_id" />
    <column name="language_id" />
  </lookup-key>
  <!-- Specify the columns into which data will be inserted -->  
  <columns>
    <column name="message_id"  type="number"/>
    <column name="language_id" type="string" language="%x"/>
    <column name="message"     type="string" translate="yes"/>
  </columns>
  <!-- Specify the data to be inserted -->
  <dataset>
    <row>
      <col name="message_id">1</col>
      <col name="message" translation-note="dnt'X'">Welcome to System X</col>
    </row>
    <row>
      <col name="message_id">2</col>
      <col name="message">Please enter username and password</col>
    </row>
    <!-- ... -->
  </dataset> 
</table>

例14-5 dateTime行

<row>
  <col name="article_id">12345678</col>
  <col name="author_id">10500</col>
  <col name="submission">2002-03-09T16:01:37</col>
  <col name="title">...</col>
  <!-- some columns follows -->
</row>
14.3.2.2 データセットの翻訳の指定

translation属性を使用して、列に翻訳済データが含まれるかどうかを指定できます。

これは、「DLFの属性」で説明しています。例14-3では、2つの<column>要素が異なった方法でtranslate属性を使用しています。language_id列の属性は、constant属性の値を翻訳する必要があることを指定します。

<column name="language_id" type="string" constant="us" translate="yes"/>

対照的に、次のtranslate属性は、この列と一致する名前を持つ<dataset>セクション内のデータの翻訳を要求します。

<column name="message"     type="string" translate="yes"/>

たとえば、前述の要素は、<dataset>セクション内の次のメッセージを翻訳する必要があることを指定します。

<col name="message" translation-note="dnt'X'">Welcome to System X</col>
<col name="message">Please enter username and password</col>

アプリケーションのメッセージを翻訳するとき、指定した語句を未翻訳のままにする必要がある場合もあります。前述の例に示したtranslation-note属性は、この目的を果します。

Extensible Stylesheet Language Transformation (XSLT)プロセッサは、前の形式を別の形式に変換できます。これによって、ローカライゼーション・サービス・プロバイダ間で翻訳データを交換し、XMLベースの翻訳ツールで使用できます。この変換により、開発者は、リビジョンの追跡や翻訳可能な文字列の単位としての分類などのタスクを行う必要がありません。

例14-6に、翻訳後の例14-3の文書(の先頭部分)を示します。

例14-7に、翻訳後の例14-4の文書を示します。先ほどの例と異なり、列定義は変更されません。

翻訳処理中にテキスト・エディタまたは従来のテキストベースの翻訳ツールを使用する場合は、文書のエンコーディングを保持することが重要です。翻訳後の文書は、元の文書とエンコーディングが異なる可能性があります。「DLFでのXML宣言」で説明しているように、翻訳済の文書のエンコーディングがUnicode以外の場合は、最初の行のXML宣言にエンコーディング宣言を追加します。Unicode以外のエンコーディングの宣言は、次のようになります。

<?xml version="1.0" encoding="ISO-8859-15"?>

翻訳処理で構文の整合性が損われていないことを確認するには、文書をXMLとして処理します。それ以外の場合は、コマンドライン・インタフェースの-vオプションを指定して、形式を確認できます。構文エラーが存在する場合は、エラーの場所と説明が出力されます。データ転送を正常に実行するには、エラーを修正する必要があります。

例14-6 example_es.xml

<?xml version="1.0"?>
<table xml:lang="es" name="translated_messages">
<!-- Specify the unique identifier -->
<lookup-key>
<column name="message_id" />
<column name="language_id" />
</lookup-key>
<!-- Specify the columns into which data will be inserted -->
<columns>
<column name="message_id" type="number"/>
<column name="language_id" type="string" constant="es"
translate="yes"/>

例14-7 language属性を持つexample_es.xml

<?xml version="1.0"?>
<table xml:lang="es"  name="translated_messages">
  <!-- Specify the unique identifier -->
  <lookup-key>
    <column name="message_id" />
    <column name="language_id" />
  </lookup-key>
  <!-- Specify the columns into which data will be inserted -->
  <columns>
    <column name="message_id"  type="number"/>
    <column name="language_id" type="string" language="%x"/>
...

14.3.3 データのロード

デモ・プログラムtxdemo1.javaの使用方法について説明します。

例14-3および例14-8のサンプル文書を例14-1で作成したtranslated_messages表にロードできます。その後、TransXデモ・ディレクトリにある例14-8のサンプル・プログラムを使用して、データをロードできます。

txdemo1.javaプログラムは次の手順を実行します。

  1. TransXローダー・オブジェクトを作成します。次に例を示します。

    TransX  transx = loader.getLoader();
    
  2. データ・ロード・セッションをオープンします。最初の3つのコマンドライン・パラメータは、JDBC接続文字列、データベース・ユーザー名およびデータベース・パスワードです。これらのパラメータは、TransX.open()メソッドに渡されます。プログラムには次の文が含まれます。

    transx.open( args[0], args[1], args[2] );
    
  3. TransXローダーを構成します。重複した行をスキップし、入力データセットを検証するようにローダーを構成します。プログラムには次の文が含まれます。

    transx.setLoadingMode( LoadingMode.SKIP_DUPLICATES );
    transx.setValidationMode( false );
    
  4. データをロードします。最初の3つのコマンドライン・パラメータは、接続情報を指定します。その他のパラメータは、入力XML文書を指定します。プログラムは、指定されたすべてのドキュメントに対してload()メソッドを起動します。

    for ( int i = 3 ; i < args.length ; i++ )
    {
      transx.load( args[i] );
    }
    
  5. データ・ロード・セッションをクローズします。プログラムには次の文が含まれます。

    transx.close();
    

javacを使用してプログラムをコンパイルした後、コマンドラインからプログラムを実行できます。次の例では、シンJavaドライバを使用して、コンピュータmyhostのポート1521でインスタンスmydbに接続します。userスキーマに接続し、XML文書example.xmlおよびexample_es.xmlをロードします。

java txdemo1 "jdbc:oracle:thin:@//myhost:1521/mydb" user -pw example.xml
     example_es.xml

通常、多言語ソフトウェア・システムの構築では、翻訳されたメッセージは開発の後半段階で使用可能になります。また、時が経つにつれて改善される傾向にあります。後からデータベースにメッセージを追加するには、TransX Utilityをもう一度実行して、データセット定義に新しい行を追加します。TransXは新しい行を認識し、<lookup-key>セクションに指定された列に基づいて新しいメッセージのみを挿入します。一部のメッセージが更新された場合は、次の例に示すように-uオプションを指定してTransXを実行し、XML内に指定されたデータで既存の行を更新します。

transx -u "jdbc:oracle:thin:@//myhost:1521/mydb" user -pw example.xml
       example_es.xml

例14-8 txdemo1.java

// Copyright (c) 2001 All rights reserved Oracle Corporation
 
import oracle.xml.transx.*;
 
public class txdemo1 {
 
  /**
   * Constructor
   */
  public txdemo1() {
  }
 
  /**
   * main
   * @param args
   *
   * args[0] : connect string
   * args[1] : username
   * args[2] : password
   * args[3+] : xml file names
   */
  public static void main(String[] args) throws Exception {
 
    // instantiate a transx class
    TransX  transx = loader.getLoader();
 
    // start a data loading session
    transx.open( args[0], args[1], args[2] );
 
    // specify operation modes
    transx.setLoadingMode( LoadingMode.SKIP_DUPLICATES );
    transx.setValidationMode( false );
 
    // load the dataset(s)
    for ( int i = 3 ; i < args.length ; i++ )
    {
      transx.load( args[i] );
    }
 
    // cleanup
    transx.close();
  }
}

14.3.4 データの問合せ

translated_messagesの問合せの結果を示します。

例14-8のプログラムを使用してデータをロードした後、表translated_messagesを問い合せて、次のような結果を確認できます。

MESSAGE_ID  LANGUAGE_ID  MESSAGE
----------  -----------  ----------------------------------
1           us           Welcome to System X
1           es           Bienvenido al Sistema X
2           us           Please enter username and password
2           es           Porfavor entre su nombre de usuario y su contraseña

WHERE句でlanguage_idおよびmessage_id列を使用して、アプリケーションで特定の言語のメッセージを取得できます。たとえば、次の問合せを実行できます。

SELECT message 
FROM   translated_messages 
WHERE  message_id = 2 
AND    language_id = 'es';

MESSAGE
----------------------------------
Porfavor entre su nombre de usuario y su contraseña