この章の内容は次のとおりです。
各Oracle JCAアダプタは、様々なエンタープライズ情報システム(EIS)とOracle BPEL Process Manager (Oracle BPEL PM)、Oracle Mediator (メディエータ)またはOracle Service Bus (OSB)の統合を可能にするソフトウェア・コンポーネントです。アダプタは、ネイティブ・メッセージをXMLまたは非XMLフォーマットで受け取り、Oracle BPEL PMまたはメディエータにXMLメッセージとしてパブリッシュします。また、XMLメッセージを受け取り、ネイティブEISフォーマットに変換することもできます。このネイティブ・データ・フォーマットとXMLの間の変換は、定義ファイル(非XMLスキーマ定義)を使用して実行され、定義ファイル自体はXMLスキーマ・フォーマットで定義されます。ネイティブ・フォーマット・ビルダー・ウィザードを使用すると、サンプル・ネイティブ・データを使用し、ネイティブXSD (NXSD)構文をネイティブ・データの変換用に作成できます。
図6-1に示すように、アダプタ構成ウィザードの「メッセージ」ページで「ネイティブ・フォーマットのスキーマの定義」ボタンをクリックすると、ネイティブ・フォーマット・ビルダー・ウィザードが表示されます。「メッセージ」ページは、アダプタ構成ウィザードで「終了」ページの前に表示される最後のページです。
ネイティブ・フォーマット・ビルダー・ウィザードでは、図6-2に示されているファイル形式からのネイティブ・スキーマ・ファイルの作成を支援します。ネイティブ・スキーマを作成するには、選択されたタイプのサンプル・データのファイル形式が必要です。また、このウィザードを使用して作成された既存のネイティブ・スキーマ(Document Type Definition (DTD)またはCOBOLコピーブック・ファイル・タイプから生成されたものを除く)を編集することもできます。ネイティブ・スキーマ・ファイルの編集の詳細は、「ネイティブ・スキーマ・ファイルの編集」を参照してください。
このオプションを選択すると、ユーザーが指定したCOBOLコピーブック定義からネイティブ・スキーマを生成できます。
COBOLメインフレーム・アプリケーションでは、通常COBOLコピーブック・ファイルを使用してデータ・レイアウトを定義します。実行時トランスレータが、関連するデータ・ファイルを解析できるように、コンバータがCOBOLコピーブックからネイティブ・スキーマを作成します。
COBOLコピーブックは、グループ・アイテム(構造)のコレクションです。これらのグループ・アイテムには、グループまたは基本アイテムであるその他のアイテムが含まれます。基本アイテムはそれ以上分割できないアイテムです。次に例を示します。
01 Purchase-Order
05 Buyer
10 BuyerName PIC X(5) USAGE DISPLAY.
04 Seller
08 SellerName PICTURE XXXXX.
Purchase-orderは、2つの子グループ・アイテム(Buyer、Seller)を持つグループ・アイテムです。01、05、04などの数値は、グループのレベル(そのグループ内のデータの階層)を示します。
グループは、階層の同じレベルに異なるレベル番号を持つように定義することもできます。たとえば、BuyerおよびSellerには異なるレベル番号がありますが、階層内では同じレベルです。グループ・アイテムには、そのグループのレベル番号以下のレベル番号が発生するまで続く、すべてのグループと基本アイテムが含まれます。
各グループ・アイテム(BuyerおよびSeller)には子の基本アイテムがあります。PICまたはPICTURE句でデータ・レイアウトが定義されています。たとえば、BuyerNameではサイズが5文字の英数字が定義されています。SellerNameのデータ・レイアウトはBuyerNameと同じです。
COBOLのグループ・アイテムは、XMLスキーマのcomplexTypeタイプの要素にマップできます。同様に、基本アイテムは、実行時トランスレータが対応するデータ・ファイルを解析するのに役立つ特定のネイティブ・フォーマットの注釈が付けられたsimple typeタイプの要素にマップできます。たとえば、Buyerアイテムは次の定義にマップできます。
<!--COBOL declaration : 05 Buyer-->
<element name="Buyer">
<complexType>
<sequence>
<!--COBOL declaration : 10 Name PIC X(5)-->
<element name="Name" type="string" nxsd:style="fixedLength"
nxsd:padStyle="tail" nxsd:paddedBy=" " nxsd:length="5"/>
</sequence>
</complexType>
</element>
次の情報を指定する必要があります。
生成されるネイティブ・スキーマのターゲット・ネームスペース。
データ・ファイルが生成されたホスト・コンピュータのキャラクタ・セット。デフォルトではEBCDICに設定されます(ebcdic-cp-us)。
データ・ファイルが生成されたホスト・コンピュータのバイト順。デフォルトではビッグ・エンディアンに設定されます。
レコード・デリミタ(通常は改行文字)、デリミタなし、またはユーザー指定の文字列。
生成されたネイティブ・スキーマのコンテナ・タグの名前。デフォルトではRoot-Elementに設定されます。
表6-1に、COBOL句を示します。表6-1に出現する数値タイプは、1桁ごとに1文字として保存されます。句のサポートは次のように定義されています。
Yは、句がサポートされていることを意味します。
Nは、句がサポートされていないことを意味します。
Iは、句が無視されることを意味します。
表6-1 COBOL句(数値タイプを1桁ごとに1文字として保存)
| COBOL句 | 設計時のサポート | 実行時のサポート | サポートされているシノニム | コメント |
|---|---|---|---|---|
|
|
|
|
英数字 - コンピュータのキャラクタ・セットで許可されている文字。Xはそれぞれ1バイトに対応します。 |
|
|
|
|
アルファベット - アルファベットまたは空白の任意の文字。Aはそれぞれ1バイトに対応します。 |
|
|
|
|
数字を含む任意の文字位置。9はそれぞれアイテムのサイズに含められます。 |
|
|
|
固定長配列 |
|
|
|
|
|
|
|
|
|
同じコンピュータのメモリー領域を異なるデータ・アイテムで表すことができます。 |
|
|
|
|
サイズは、 |
|
|
|
|
該当なし |
|
|
|
|
無視されます |
|
|
N |
N |
COBOLコピーブックではあまり使用されません。 |
|
|
N |
N |
4バイトの索引です |
|
|
|
I |
|
該当なし |
|
|
|
該当なし |
|
|
該当なし |
|||
|
|
|
該当なし |
表6-2 COBOL句(より効率的に保存される数値タイプ)
| COBOL句 | 設計時のサポート | 実行時のサポート | サポートされているシノニム | コメント |
|---|---|---|---|---|
|
Y |
Y |
これらのキーワードはどちらもオプションです。 |
|
|
Y |
Y |
|
|
|
Y |
Y |
|
4バイトの長さの単精度の浮動小数点数。 |
|
|
|
|
8バイトの長さの倍精度の浮動小数点数。 |
|
|
|
|
2つの数字は各バイトに保存されます。最後のその他の半バイトは、値が無署名でも署名用に割り当てられます。 |
|
|
|
|
|
|
|
|
ネイティブ・バイナリ表現の容量。 |
|
|
|
|
|
デフォルトで、最も右端のニブルに署名します。 |
|
|
|
|
|
|
|
|
該当なし |
|
|
|
|
長さは |
|
|
|
|
長さは、 |
次の句を追加して署名の位置を変更できます。
SIGN IS LEADING
署名されたゾーンの数値とともに使用します。
SIGN IS TRAILING
署名されたゾーンの数値とともに使用します。
SIGN IS LEADING SEPARATE
文字Sがサイズに含まれます。
SIGN IS TRAILING SEPARATE
文字Sがサイズに含まれます。
注意:
数値がIBM COBOLフォーマットで保存されることを前提としています。異なるデータ保存フォーマットのその他のプラットフォーム用に生成されている場合は、そのタイプのカスタム・データ・ハンドラを記述する必要があります。
表6-3に、ピクチャ編集タイプを示します。
表6-3 編集済ピクチャ
| 編集済ピクチャ | サポートされている編集タイプ | サポートされていない編集タイプ |
|---|---|---|
編集済英数字 |
単純な挿入: B(空白) |
|
編集済浮動数値 |
特殊な挿入: |
|
編集済数値 |
|
|
編集済ピクチャは、プレゼンテーション目的でデータ・ファイルではほとんど使用されません。記号の編集もデータで行うことを前提としています。たとえば、次のようなフィールドがあるとします。
05 AMOUNT PIC 999.99
このフィールドの幅は6バイトで、データに小数点があります。
単純、特殊および固定挿入はこの方法で処理されます。浮動挿入、ゼロ抑止および置換挿入はサポートされていません。
指定の場所で、JSONサンプル・ファイルまたはJSONファイルからNXSDスキーマを生成します。JSONは、人間が判読可能なデータの交換を行うためのテキストベースのオープン・スタンダードです。JSONは、オブジェクトと呼ばれる、単純なデータ構造および連想配列を表現するためのJavaScriptスクリプト言語から導出されます。
このオプションを選択すると、ネイティブ・フォーマット・ビルダー・ウィザードに「JSONファイルの説明」画面が表示されます。次の項目を入力できます。
ファイル名: JSONファイルの名前。
ターゲット・ネームスペース: ターゲット・ネームスペースが表示されます。
ルート要素: JSONルート・レベルを指定します。
キャラクタ・セット: 使用するキャラクタ・セットを選択します。
JSONの使用の詳細は、『Oracle Fusion Middleware Oracle SOA SuiteでのSOAアプリケーションの開発 12c Release 1 (12.1.3.0)』を参照してください。
デリミタ付き、固定長または複合タイプのファイルをサンプリングすることで、ネイティブ・フォーマット・ビルダー・ウィザードを使用して生成された既存のネイティブ・スキーマを編集できます。既存のネイティブ・スキーマを編集するには、ネイティブ・フォーマット・ビルダー・ウィザードの「タイプの選択」ページで「既存ファイルの編集」オプションを選択し、「参照」をクリックして既存のスキーマ・ファイルの場所にナビゲートし、編集対象のネイティブ・スキーマ・ファイルを選択します。ネイティブ・フォーマット・ビルダー・ウィザードに表示される指示に従って、ネイティブ・スキーマ・ファイルを編集します。
注意:
Document Type Definition (DTD)またはCOBOLコピーブック・ファイル・タイプから生成されたネイティブ・スキーマは編集できません。
図6-3に、「ネイティブ・フォーマット・ビルダー - タイプの選択」ページで「既存ファイルの編集」オプションが選択されている様子を示します。
ネイティブ・スキーマ・ファイルを編集する前に、スキーマ内の注釈で指定されているサンプル・ファイルが存在することを確認する必要があります。この注釈は、ネイティブ・スキーマがサンプル・ファイルから初めて生成される際に自動的に追加されます。
次の例に、生成される注釈を示します。
例 - 生成される注釈
<xsd:annotation>
<xsd:appinfo>NXSDSAMPLE=/scratch/bob/sample.txt</xsd:appinfo>
<xsd:appinfo>USEHEADER=true</xsd:appinfo>
</xsd:annotation>
たとえば、注釈で指定されたサンプル・ファイルのパスが<!--NXSDWIZ:C:\Temp\Book1Out.csv:-->の場合に、このファイルが指定のパスに存在しなければ、ウィザードでエラーが表示されます。
この項では、ネイティブ・フォーマット・データをXMLに変換するために使用するネイティブ・スキーマの各種コンストラクトの概要と、これらのネイティブ・スキーマ・コンストラクトの使用方法について説明します。
この項には次のトピックが含まれます:
表6-4に、<schema>タグにのみ適用可能なコンストラクトを示します。
表6-4 <schema>タグにのみ適用可能なコンストラクト
| 構文 | 説明 |
|---|---|
|
ネイティブ・データのバイト順。 |
|
実際のデータが格納されるエンコーディング。通常は、相互運用性とUnicodeがサポートされているため、UTF-8をお薦めします。Javaランタイム環境でサポートされている有効なエンコーディングは、いずれも指定できます。サポートされているエンコーディングの完全な一覧については、 |
|
アウトバウンドでネイティブの非xmlデータを強制的に引用符で囲む必要がある場合は、trueに設定します。 |
|
ネイティブ・データの変換前にスキップする行数を指定する正の整数。 |
|
ネイティブ・データの変換前に指定された文字列までスキップします。 |
|
宣言されている場合、 |
|
データが文字とバイトのどちらで保存されるかを示します。許可された値は |
|
大量のメッセージにおいて、ネイティブ・データの一意のメッセージ・セパレータを指定する文字列。 |
|
ネイティブ・データのタイプ。可能な値は |
|
宣言されている場合、 |
|
アウトバウンド・メッセージに挿入するヘッダー値を指定する文字列。 |
|
ネイティブ・ファイルで処理する行数を指定する整数。 |
|
フィールド |
|
|
|
|
|
|
|
|
|
|
表6-5に、<schema>タグ以外のすべてのタグに適用可能なコンストラクトを示します。
表6-5 <schema>タグ以外のすべてのタグに適用可能なコンストラクト
| 構文 | 説明 |
|---|---|
|
指定された長さを占有しているネイティブ・データに保存される配列の長さ。 |
|
このコンストラクトの値は、配列の長さとして使用されます。また、有効な数値に解決される変数の場合もあります。この値は、それが指定されているパーティクルの nxsd:style="array" nxsd:arrayLength="10" これは、配列の長さが |
|
指定された文字列で終了する配列の最後のアイテム。 |
|
宣言されている変数に値を割り当てます。 |
|
指定された文字列で区切られるネイティブ・データの配列のセル。 |
|
|
|
|
|
このコンストラクトに指定された値は、データ全体ではなくデータの一部のみを変換するために使用されます。 |
|
ネイティブ・データの日付を表すJava日付フォーマット。 |
|
実際のデータの長さが保存されている文字数およびバイト数。 |
|
指定された文字列で区切られているリストのアイテム。 |
|
囲まれているネイティブ・データ。 |
|
読み取られるネイティブ・データの長さ。固定長スタイルで使用されます。 |
|
指定された文字列で終了するリストの最後のアイテム。 |
|
入力ストリームの現在の位置よりも先の一致を検索します。一致が検出されると、このコンストラクトが指定されているノードが処理され、検出されない場合はスキップされます。この機能は次のように使用します。 nxsd:lookAhead="20" nxsd:lookFor="abc" これは、 |
|
余白に使用される文字列。 |
|
|
|
指定された文字列で囲まれるネイティブ・データ。 デフォルトでは、指定された文字列は |
|
指定されたバイト数または文字数をスキップします。 |
|
指定された行数をスキップします。 |
|
指定された文字列までスキップします。 |
|
ネイティブ・データの指定された文字列を検索します。存在する場合は、それが指定されている要素の処理を続行し、存在しない場合はスキップして次の要素を処理します。 |
|
入力ストリームからのネイティブ・データの読取りに使用されるスタイル。許可された値は |
|
指定された文字列で囲まれるネイティブ・データ。 |
|
指定された文字列で終了するネイティブ・データ。 |
|
単一の変数を宣言します。 |
|
一連の変数を宣言するか、宣言されている変数に値を割り当てます。 |
この項には次のトピックが含まれます:
ネイティブ・フォーマットの固定長データは、固定長スタイルを使用してネイティブ・スキーマに定義できます。固定長には次の3つのタイプがあります。
余白あり
余白なし
ネイティブ・データから実際の長さも読み取られるタイプ
変換されるネイティブ・データ・フォーマット: 余白あり
実際のデータが指定された長さに満たない場合があります。この場合には、headまたはtailとしてpaddedByおよびpadStyleを指定できます。データが読み取られると、余白はそれに従って削除されます。変換対象のサンプルのネイティブ・データを次に示します。
GBP*UK000012550.00
ネイティブ・スキーマ: 余白あり
<?xml version="1.0" encoding="US-ASCII"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
targetNamespace="http://www.oracle.com/ias/processconnect"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:stream="chars"
nxsd:version="NXSD">
<element name="fixedlength">
<complexType>
<sequence>
<element name="currency_code" nxsd:style="fixedLength" nxsd:length="4"
nxsd:padStyle="tail" nxsd:paddedBy="*">
<simpleType>
<restriction base="string">
<maxLength value="4" />
</restriction>
</simpleType>
</element>
<element name="country_code" nxsd:style="fixedLength" nxsd:length="2"
nxsd:padStyle="none">
<simpleType>
<restriction base="string">
<length value="2" />
</restriction>
</simpleType>
</element>
<element name="to_usd_rate" nxsd:style="fixedLength" nxsd:length="12"
nxsd:padStyle="head" nxsd:paddedBy="0">
<simpleType>
<restriction base="string">
<maxLength value="12" />
</restriction>
</simpleType>
</element>
</sequence>
</complexType>
</element>
</schema>
ネイティブ・スキーマを使用して変換したXML: 余白あり
<fixedlength xmlns="http://www.oracle.com/ias/processconnect"> <currency_code>GBP</currency_code> <country_code>UK</country_code> <to_usd_rate>12550.00</to_usd_rate> </fixedlength>
変換されるネイティブ・データ・フォーマット: 余白なし
ネイティブ・スキーマに固定長データを定義するには、固定長スタイルを使用できます。実際のデータが指定された長さに満たない場合、空白は削除されません。変換対象のサンプルのネイティブ・データを次に示します。
GBP*UK000012550.00
ネイティブ・スキーマ: 余白なし
<?xml version="1.0" encoding="US-ASCII"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
targetNamespace="http://www.oracle.com/ias/processconnect"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:stream="chars"
nxsd:version="NXSD">
<element name="fixedlength">
<complexType>
<sequence>
<element name="currency_code" nxsd:style="fixedLength" nxsd:length="4">
<simpleType>
<restriction base="string">
<maxLength value="4" />
</restriction>
</simpleType>
</element>
<element name="country_code" nxsd:style="fixedLength" nxsd:length="2">
<simpleType>
<restriction base="string">
<length value="2" />
</restriction>
</simpleType>
</element>
<element name="to_usd_rate" nxsd:style="fixedLength" nxsd:length="12">
<simpleType>
<restriction base="string">
<maxLength value="12" />
</restriction>
</simpleType>
</element>
</sequence>
</complexType>
</element>
</schema>
ネイティブ・スキーマを使用して変換したXML: 余白なし
<fixedlength xmlns="http://www.oracle.com/ias/processconnect"> <currency_code>GBP*</currency_code> <country_code>UK</country_code> <to_usd_rate>000012550.00</to_usd_rate> </fixedlength>
変換されるネイティブ・データ・フォーマット: ネイティブ・データから実際の長さも読み取られる場合
データの長さもネイティブ・ストリームに保存される場合、まず長さの読取り、次に読み取られた長さに応じたデータの読取りにこのスタイルが使用されます。変換対象のサンプルのネイティブ・データを次に示します。
03joe13DUZac.1HKVmIY
ネイティブ・スキーマ: ネイティブ・データから実際の長さも読み取られる場合
<?xml version="1.0" encoding="US-ASCII"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
targetNamespace="http://www.oracle.com/ias/processconnect"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:stream="chars"
nxsd:version="NXSD">
<element name="fixedlength">
<complexType>
<sequence>
<element name="user" type="string" nxsd:style="fixedLength"
nxsd:identifierLength="2" />
<element name="encr_user" type="string" nxsd:style="fixedLength"
nxsd:identifierLength="2" />
</sequence>
</complexType>
</element>
</schema>
ネイティブ・スキーマを使用して変換したXML: ネイティブ・データから実際の長さも読み取られる場合
<fixedlength xmlns="http://www.oracle.com/ias/processconnect"> <user>joe</user> <encr_user>DUZac.1HKVmIY</encr_user> </fixedlength>
このフォーマットは、終了マーク自体をデリミタではなく、実際のデータとして処理する場合に使用されます。マークが実際のデータの一部であるかどうかが不明な場合は、念のためにnxsd:quotedByを使用できます。nxsd:quotedByを指定すると、対応するネイティブ・データが引用符で囲まれる場合と囲まれない場合があります。囲まれている場合、実際のデータは、nxsd:quotedByでの指定に応じて開始の引用符から終了の引用符まで読み取られます。囲まれていない場合は、terminatedBy文字が検出されるまで読み取られます。
デフォルトでは、終了マークは"(")です。データにこの文字が含まれている場合は、フィールドが引用符で囲まれていない場合にも、このデフォルトをオーバーライドする必要があります。詳細は、後述の「変換されるネイティブ・データ・フォーマット: デフォルトの引用符文字を含むデータ」を参照してください。
以降の各項では、引用符付き(オプション)と引用符なしのシナリオ、およびデフォルトの引用符文字を含むシナリオを示します。
変換されるネイティブ・データ・フォーマット: 引用符付き(オプション)
変換対象のサンプルのネイティブ・データを次に示します。
Fred,"2 Old Street, Old Town,Manchester",20-08-1954,0161-499-1718
ネイティブ・スキーマ: 引用符付き(オプション)
<?xml version="1.0" encoding="US-ASCII"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
targetNamespace="http://www.oracle.com/ias/processconnect"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:stream="chars"
nxsd:version="NXSD">
<element name="terminated">
<complexType>
<sequence>
<element name="PersonName" type="string" nxsd:style="terminated"
nxsd:terminatedBy="," />
<element name="Address" type="string" nxsd:style="terminated"
nxsd:terminatedBy="," nxsd:quotedBy="""/>
<element name="DOB" type="string" nxsd:style="terminated"
nxsd:terminatedBy="," />
<element name="Telephone" type="string" nxsd:style="terminated"
nxsd:terminatedBy="${eol}" />
</sequence>
</complexType>
</element>
ネイティブ・スキーマを使用して変換したXML: 引用符付き(オプション)
<terminated xmlns="http://www.oracle.com/ias/processconnect"> <PersonName>Fred</PersonName> <Address>2 Old Street, Old Town,Manchester</Address> <DOB>20-08-1954</DOB> <Telephone>0161-499-1718</Telephone> </terminated>
変換されるネイティブ・データ・フォーマット: 引用符なし
データが特定の文字列または文字で終了する場合に使用されます。変換対象のサンプルのネイティブ・データを次に示します。
1020,16,18,,1580.00
ネイティブ・スキーマ: 引用符なし
<?xml version="1.0" encoding="US-ASCII"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
targetNamespace="http://www.oracle.com/ias/processconnect"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:stream="chars"
nxsd:version="NXSD">
<element name="terminated">
<complexType>
<sequence>
<element name="product" type="string" nxsd:style="terminated"
nxsd:terminatedBy="," />
<element name="ordered" type="string" nxsd:style="terminated"
nxsd:terminatedBy="," />
<element name="inventory" type="string" nxsd:style="terminated"
nxsd:terminatedBy="," />
<element name="backlog" type="string" nxsd:style="terminated"
nxsd:terminatedBy="," />
<element name="listprice" type="string" nxsd:style="terminated"
nxsd:terminatedBy="${eol}" />
</sequence>
</complexType>
</element>
</schema>
ネイティブ・スキーマを使用して変換したXML: 引用符なし
<terminated xmlns="http://www.oracle.com/ias/processconnect"> <product>1020</product> <ordered>16</ordered> <inventory>18</inventory> <backlog></backlog> <listprice>1580.00</listprice> </terminated>
変換されるネイティブ・データ・フォーマット: デフォルトの引用符文字を含むデータ
変換対象のサンプルのネイティブ・データを次に示します。
aaa,"bbbbb,[cccc
この場合、フィールドはカンマで終了し、"文字は2番目のフィールドのデータに含まれ、[文字は3番目のフィールドのデータに含まれています。
デフォルトのnxsd:quotedBy終了マークは"(")であるため、このフィールドがカンマ文字で終了すると指定しても、Oracleファイル・アダプタはフィールド2の変換に失敗します。このデータを正常に変換するには、デフォルトのnxsd:quotedBy終了マークを、このフィールドのデータに含まれていない任意の文字にオーバーライドする必要があります。この例では、<(<)はフィールド2に含まれることがないため、デフォルトのnxsd:quotedBy終了マークをこの文字にオーバーライドします。
<element name="FieldTwo" type="string" nxsd:style="terminated" nxsd:terminatedBy="," nxsd:quotedBy="<"/>
対照的に、フィールド3については、[文字はデフォルトのnxsd:quotedBy終了マークと競合しないため、指定する必要があるのはnxsd:terminatedBy=","のみとなります。
<element name="FieldThree" type="string" nxsd:style="terminated" nxsd:terminatedBy="," />
ネイティブ・スキーマ: デフォルトの引用符文字を含むデータ
<?xml version="1.0" encoding="US-ASCII"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
targetNamespace="http://www.oracle.com/ias/processconnect"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:stream="chars"
nxsd:version="NXSD">
<element name="terminated">
<complexType>
<sequence>
<element name="FieldOne" type="string" nxsd:style="terminated"
nxsd:terminatedBy="," />
<element name="FieldTwo" type="string" nxsd:style="terminated"
nxsd:terminatedBy="," nxsd:quotedBy="<"/>
<element name="FieldThree" type="string" nxsd:style="terminated"
nxsd:terminatedBy="," />
</sequence>
</complexType>
</element>
ネイティブ・スキーマを使用して変換したXML: デフォルトの引用符文字を含むデータ
<terminated xmlns="http://www.oracle.com/ias/processconnect"> <FieldOne>aaa</FieldOne> <FieldTwo>"bbbbb</FieldTwo> <FieldThree>[cccc</FieldThree> </terminated>
ネイティブ・データがマークで囲まれている場合に使用されます。
囲みデータには次のタイプがあります。
左右の囲みマークが異なる場合
左右の囲みマークが同じ場合
変換されるネイティブ・データ・フォーマット: 左右の囲みマークが異なる場合
左右の囲みマークが異なる場合に変換対象となるサンプルのネイティブ・データを次に示します。
(Ernest Hemingway Museum){Whitehead St.}
ネイティブ・スキーマ: 左右の囲みマークが異なる場合
<?xml version="1.0" encoding="US-ASCII"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
xmlns:tns="http://www.oracle.com/ias/processconnect"
targetNamespace="http://www.oracle.com/ias/processconnect"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:stream="chars"
nxsd:version="NXSD">
<element name="limstring">
<complexType>
<sequence>
<element name="Landmark" type="string" nxsd:style="surrounded" nxsd:leftSurroundedBy="(" nxsd:rightSurroundedBy=")" />
<element name="Street" type="string" nxsd:style="surrounded" nxsd:leftSurroundedBy="{" nxsd:rightSurroundedBy="}" />
</sequence>
</complexType>
</element>
</schema>
ネイティブ・スキーマを使用して変換したXML: 左右の囲みマークが異なる場合
<limstring xmlns="http://www.oracle.com/ias/processconnect"> <Landmark>Ernest Hemingway Museum</Landmark> <Street>Whitehead St.</Street> </limstring>
変換されるネイティブ・データ・フォーマット: 左右の囲みマークが同じ場合
左右の囲みマークが同じ場合に変換対象となるサンプルのネイティブ・データを次に示します。
.FL..Florida Keys.+Key West+
ネイティブ・スキーマ: 左右の囲みマークが同じ場合
<?xml version="1.0" encoding="US-ASCII"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
xmlns:tns="http://www.oracle.com/ias/processconnect"
targetNamespace="http://www.oracle.com/ias/processconnect"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:stream="chars"
nxsd:version="NXSD">
<element name="limstring">
<complexType>
<sequence>
<element name="State" type="string" nxsd:style="surrounded" nxsd:surroundedBy="."/>
<element name="Region" type="string" nxsd:style="surrounded" nxsd:surroundedBy="." />
<element name="City" type="string" nxsd:style="surrounded" nxsd:surroundedBy="+" />
</sequence>
</complexType>
</element>
</schema>
ネイティブ・スキーマを使用して変換したXML: 左右の囲みマークが同じ場合
<limstring xmlns="http://www.oracle.com/ias/processconnect"> <State>FL</State> <Region>Florida Keys</Region> <City>Key West</City> </limstring>
このフォーマットは、次の特性のあるリストに適用されます。
以降の各項では、変換されるデータのフォーマット、ネイティブ・スキーマおよび変換済XMLについて説明します。
変換されるネイティブ・データ・フォーマット
125,200,255
ネイティブ・スキーマ
<?xml version="1.0" encoding="US-ASCII"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
xmlns:tns="http://xmlns.oracle.com/pcbpel/nxsd/smoketest"
targetNamespace="http://xmlns.oracle.com/pcbpel/nxsd/smoketest"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:stream="chars"
nxsd:version="NXSD">
<element name="list" type="tns:Colors" />
<complexType name="Colors" nxsd:style="list" nxsd:itemSeparatedBy=","
nxsd:listTerminatedBy="${eol}">
<sequence>
<element name="Red" type="string" />
<element name="Green" type="string" />
<element name="Blue" type="string" />
</sequence>
</complexType>
</schema>
ネイティブ・スキーマを使用して変換したXML
<list xmlns="http://www.oracle.com/ias/processconnect"> <Red>125</Red> <Green>200</Green> <Blue>255</Blue> </list>
以降の各項では、変換されるデータのフォーマット、ネイティブ・スキーマおよび変換済XMLについて説明します。
変換されるネイティブ・データ・フォーマット
configure;startup;runtest;shutdown;
ネイティブ・スキーマ:
<?xml version="1.0" encoding="US-ASCII"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
xmlns:tns="http://xmlns.oracle.com/pcbpel/nxsd/smoketest"
targetNamespace="http://xmlns.oracle.com/pcbpel/nxsd/smoketest"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:stream="chars"
nxsd:version="NXSD">
<element name="list" type="tns:CommandSet" />
<complexType name="CommandSet" nxsd:style="list" nxsd:itemSeparatedBy=";">
<sequence>
<element name="Cmd1" type="string" />
<element name="Cmd2" type="string" />
<element name="Cmd3" type="string" />
<element name="Cmd4" type="string" />
</sequence>
</complexType>
</schema>
ネイティブ・スキーマを使用して変換したXML
<list xmlns="http://www.oracle.com/ias/processconnect"> <Cmd1>configure</Cmd1> <Cmd2>startup</Cmd2> <Cmd3>runtest</Cmd3> <Cmd4>shutdown</Cmd4> </list>
これは、個々のセルが区切り文字で区切られていて、配列の最後のセルが終了文字で終了している複合型の配列用です。
配列タイプの例を次に示します。
以降の各項では、変換されるデータのフォーマット、ネイティブ・スキーマおよび変換済XMLについて説明します。
変換されるネイティブ・データ・フォーマット
"Smith, John","1 Old Street, Old Town, Manchester",,"0161-499-1717". Fred,"2 Old Street, Old Town,Manchester","20-08-1954","0161-499-1718". "Smith, Bob",,,0161-499-1719.#
ネイティブ・スキーマ:
<?xml version="1.0" encoding="US-ASCII"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
targetNamespace="http://www.oracle.com/ias/processconnect"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:stream="chars"
nxsd:version="NXSD"
>
<element name="array">
<complexType>
<sequence>
<element name="Member" maxOccurs="unbounded"
nxsd:style="array" nxsd:cellSeparatedBy="${eol}"
nxsd:arrayTerminatedBy="#">
<complexType>
<sequence>
<element name="Name" type="string" nxsd:style="terminated"
nxsd:terminatedBy="," nxsd:quotedBy='"'/>
<element name="Address" type="string" nxsd:style="terminated"
nxsd:terminatedBy="," nxsd:quotedBy='"'/>
<element name="DOB" type="string" nxsd:style="terminated"
nxsd:terminatedBy="," nxsd:quotedBy='"'/>
<element name="Telephone" type="string" nxsd:style="terminated"
nxsd:terminatedBy="." nxsd:quotedBy='"'/>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
ネイティブ・スキーマを使用して変換したXML
<array xmlns="http://www.oracle.com/ias/processconnect">
<Member>
<Name>Smith, John</Name>
<Address>1 Old Street, Old Town, Manchester</Address>
<DOB></DOB>
<Telephone>0161-499-1717</Telephone>
</Member>
<Member>
<Name>Fred</Name>
<Address>2 Old Street, Old Town,Manchester</Address>
<DOB>20-08-1954</DOB>
<Telephone>0161-499-1718</Telephone>
</Member>
<Member>
<Name>Smith, Bob</Name>
<Address></Address>
<DOB></DOB>
<Telephone>0161-499-1719</Telephone>
</Member>
</array>
以降の各項では、変換されるデータのフォーマット、ネイティブ・スキーマおよび変換済XMLについて説明します。
変換されるネイティブ・データ・フォーマット
"Smith, John","1 Old Street, Old Town, Manchester",,"0161-499-1717". Fred,"2 Old Street, Old Town,Manchester","20-08-1954","0161-499-1718". "Smith, Bob",,,0161-499-1719.
ネイティブ・スキーマ:
<?xml version="1.0" encoding="US-ASCII"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
targetNamespace="http://www.oracle.com/ias/processconnect"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:stream="chars"
nxsd:version="NXSD">
<element name="array">
<complexType>
<sequence>
<element name="Member" maxOccurs="unbounded"
nxsd:style="array" nxsd:cellSeparatedBy="\r\n">
<complexType>
<sequence>
<element name="Name" type="string" nxsd:style="terminated"
nxsd:terminatedBy="," nxsd:quotedBy='"'/>
<element name="Address" type="string" nxsd:style="terminated"
nxsd:terminatedBy="," nxsd:quotedBy='"'/>
<element name="DOB" type="string" nxsd:style="terminated"
nxsd:terminatedBy="," nxsd:quotedBy='"'/>
<element name="Telephone" type="string" nxsd:style="terminated"
nxsd:terminatedBy="." nxsd:quotedBy='"'/>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
ネイティブ・スキーマを使用して変換したXML
<array xmlns="http://www.oracle.com/ias/processconnect">
<Member>
<Name>Smith, John</Name>
<Address>1 Old Street, Old Town, Manchester</Address>
<DOB></DOB>
<Telephone>0161-499-1717</Telephone>
</Member>
<Member>
<Name>Fred</Name>
<Address>2 Old Street, Old Town,Manchester</Address>
<DOB>20-08-1954</DOB>
<Telephone>0161-499-1718</Telephone>
</Member>
<Member>
<Name>Smith, Bob</Name>
<Address></Address>
<DOB></DOB>
<Telephone>0161-499-1719</Telephone>
</Member>
</array>
以降の各項では、変換されるデータのフォーマット、ネイティブ・スキーマおよび変換済XMLについて説明します。
変換されるネイティブ・データ・フォーマット
"Smith, John","1 Old Street, Old Town, Manchester",,"0161-499-1717" Fred,"2 Old Street, Old Town,Manchester","20-08-1954","0161-499-1718" "Smith, Bob",,,0161-499-1719 #
ネイティブ・スキーマ
<?xml version="1.0" encoding="US-ASCII"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
targetNamespace="http://www.oracle.com/ias/processconnect"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:stream="chars"
nxsd:version="NXSD">
<element name="array">
<complexType>
<sequence>
<element name="Member" maxOccurs="unbounded"
nxsd:style="array" nxsd:arrayTerminatedBy="#">
<complexType>
<sequence>
<element name="Name" type="string" nxsd:style="terminated"
nxsd:terminatedBy="," nxsd:quotedBy='"'/>
<element name="Address" type="string" nxsd:style="terminated"
nxsd:terminatedBy="," nxsd:quotedBy='"'/>
<element name="DOB" type="string" nxsd:style="terminated"
nxsd:terminatedBy="," nxsd:quotedBy='"'/>
<element name="Telephone" type="string" nxsd:style="terminated"
nxsd:terminatedBy="\r\n" nxsd:quotedBy='"'/> </sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
ネイティブ・スキーマを使用して変換したXML
<array xmlns="http://www.oracle.com/ias/processconnect">
<Member>
<Name>Smith, John</Name>
<Address>1 Old Street, Old Town, Manchester</Address>
<DOB></DOB>
<Telephone>0161-499-1717</Telephone>
</Member>
<Member>
<Name>Fred</Name>
<Address>2 Old Street, Old Town,Manchester</Address>
<DOB>20-08-1954</DOB>
<Telephone>0161-499-1718</Telephone>
</Member>
<Member>
<Name>Smith, Bob</Name>
<Address></Address>
<DOB></DOB>
<Telephone>0161-499-1719</Telephone>
</Member>
</array>
以降の各項では、変換されるデータのフォーマット、ネイティブ・スキーマおよび変換済XMLについて説明します。
変換されるネイティブ・データ・フォーマット
3"Smith, John","1 Old Street, Old Town, Manchester",,"0161-499-1717" Fred,"2 Old Street, Old Town,Manchester","20-08-1954","0161-499-1718" "Smith, Bob",,,0161-499-1719
ネイティブ・スキーマ:
<?xml version="1.0" encoding="US-ASCII"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
targetNamespace="http://www.oracle.com/ias/processconnect"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:stream="chars"
nxsd:version="NXSD">
<element name="arrayidentifierlength">
<complexType>
<sequence>
<element name="Member" maxOccurs="unbounded" nxsd:style="array"
nxsd:arrayIdentifierLength="1">
<complexType>
<sequence>
<element name="Name" type="string" nxsd:style="terminated"
nxsd:terminatedBy="," nxsd:quotedBy='"'/>
<element name="Address" type="string" nxsd:style="terminated"
nxsd:terminatedBy="," nxsd:quotedBy='"'/>
<element name="DOB" type="string" nxsd:style="terminated"
nxsd:terminatedBy="," nxsd:quotedBy='"'/>
<element name="Telephone" type="string" nxsd:style="terminated"
nxsd:terminatedBy="\r\n" nxsd:quotedBy='"'/>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
ネイティブ・スキーマを使用して変換したXML
<arrayidentifierlength xmlns="http://www.oracle.com/ias/processconnect">
<Member>
<Name>Smith, John</Name>
<Address>1 Old Street, Old Town, Manchester</Address>
<DOB></DOB>
<Telephone>0161-499-1717</Telephone>
</Member>
<Member>
<Name>Fred</Name>
<Address>2 Old Street, Old Town,Manchester</Address>
<DOB>20-08-1954</DOB>
<Telephone>0161-499-1718</Telephone>
</Member>
<Member>
<Name>Smith, Bob</Name>
<Address></Address>
<DOB></DOB>
<Telephone>0161-499-1719</Telephone>
</Member>
</arrayidentifierlength>
以降の各項では、変換されるデータのフォーマット、ネイティブ・スキーマおよび変換済XMLについて説明します。
変換されるネイティブ・データ・フォーマット
3;John;Steve;Paul;Todd;
ネイティブ・スキーマ
<?xml version="1.0" encoding="US-ASCII"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
targetNamespace="http://xmlns.oracle.com/pcbpel/nxsd/smoketest"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:stream="chars"
nxsd:version="NXSD">
<element name="array">
<annotation>
<appinfo>
<nxsd:variables>
<nxsd:variable name="len" />
</nxsd:variables>
</appinfo>
</annotation>
<complexType>
<sequence>
<element name="TotalMembers" type="string" nxsd:style="terminated"
nxsd:terminatedBy=";">
<annotation>
<appinfo>
<nxsd:variables>
<nxsd:assign name="len" value="${0}" />
</nxsd:variables>
</appinfo>
</annotation>
</element>
<element name="Member" type="string" minOccurs="0" maxOccurs="unbounded"
nxsd:style="array,terminated" nxsd:arrayLength="${len}"
nxsd:terminatedBy=";" />
</sequence>
</complexType>
</element>
</schema>
ネイティブ・スキーマを使用して変換したXML
<array xmlns="http://xmlns.oracle.com/pcbpel/nxsd/smoketest"> <TotalMembers>3</TotalMembers> <Member>John</Member> <Member>Steve</Member> <Member>Paul</Member> </array>
この項では、条件付き処理に関する次のような例が用意されています。
以降の各項では、変換されるデータのフォーマット、ネイティブ・スキーマおよび変換済XMLについて説明します。
変換されるネイティブ・データ・フォーマット
PO28/06/2004^|ABCD Inc.|Oracle OracleApps025070,000.00 Database 021230,000.00 ProcessCon021040,000.00 PO01/07/2004^|EFGH Inc.|Oracle DB2 021230,000.00 Eclipse 021040,000.00 SO29/06/2004|Oracle Apps|5 Navneet Singh PO28/06/2004^|IJKL Inc.|Oracle Weblogic 025070,000.00 Tuxedo 021230,000.00 JRockit 021040,000.00 IN30/06/2004;Navneet Singh;Oracle;Oracle Apps;5;70,000.00;350,000.00
ネイティブ・スキーマ
<?xml version="1.0" encoding="US-ASCII"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
xmlns:tns="http://www.oracle.com/ias/processconnect"
targetNamespace="http://www.oracle.com/ias/processconnect"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:stream="chars"
nxsd:version="NXSD">
<element name="container">
<complexType>
<choice maxOccurs="unbounded" nxsd:choiceCondition="fixedLength"
nxsd:length="2">
<element ref="tns:PurchaseOrder" nxsd:conditionValue="PO" />
<element ref="tns:SalesOrder" nxsd:conditionValue="SO" />
<element ref="tns:Invoice" nxsd:conditionValue="IN" />
</choice>
</complexType>
</element>
<!-- PO -->
<element name="PurchaseOrder" type="tns:POType"/>
<complexType name="POType">
<sequence>
<element name="Date" type="string" nxsd:style="terminated"
nxsd:terminatedBy="^" />
<element name="Buyer" type="string" nxsd:style="surrounded"
nxsd:surroundedBy="|" />
<element name="Supplier" type="string" nxsd:style="terminated"
nxsd:terminatedBy="${eol}" />
<element name="Items">
<complexType>
<sequence>
<element name="Line-Item" minOccurs="3" maxOccurs="3">
<complexType>
<group ref="tns:LineItems" />
</complexType>
</element>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
<group name="LineItems">
<sequence>
<element name="Id" type="string" nxsd:style="fixedLength" nxsd:length="10"
nxsd:padStyle="none"/>
<element name="Quantity" type="string" nxsd:style="fixedLength"
nxsd:identifierLength="2" />
<element name="Price" type="string" nxsd:style="terminated"
nxsd:terminatedBy="${eol}" />
</sequence>
</group>
<!-- SO -->
<element name="SalesOrder" type="tns:SOType" />
<complexType name="SOType">
<sequence>
<element name="Date" type="string" nxsd:style="terminated"
nxsd:terminatedBy="|" />
<element name="Item" type="string" nxsd:style="terminated"
nxsd:terminatedBy="|" />
<element name="Quantity" type="string" nxsd:style="terminated"
nxsd:terminatedBy="${eol}" />
<element name="Buyer" type="string" nxsd:style="terminated"
nxsd:terminatedBy="${eol}" />
</sequence>
</complexType>
<!-- INV -->
<element name="Invoice" type="tns:INVType" />
<complexType name="INVType">
<sequence>
<element name="Date" type="string" nxsd:style="terminated"
nxsd:terminatedBy=";" />
<element name="Purchaser" type="string" nxsd:style="terminated"
nxsd:terminatedBy=";" />
<element name="Seller" type="string" nxsd:style="terminated"
nxsd:terminatedBy=";" />
<element name="Item" type="string" nxsd:style="terminated"
nxsd:terminatedBy=";" />
<element name="Price" type="string" nxsd:style="terminated"
nxsd:terminatedBy=";" />
<element name="Quantity" type="string" nxsd:style="terminated"
nxsd:terminatedBy=";" />
<element name="TotalPrice" type="string" nxsd:style="terminated"
nxsd:terminatedBy="${eol}" />
</sequence>
</complexType>
</schema>
ネイティブ・スキーマを使用して変換したXML
<container xmlns="http://www.oracle.com/ias/processconnect">
<PurchaseOrder>
<Date>28/06/2004</Date>
<Buyer>ABCD Inc.</Buyer>
<Supplier>Oracle</Supplier>
<Items>
<Line-Item>
<Id>OracleApps</Id>
<Quantity>50</Quantity>
<Price>70,000.00</Price>
</Line-Item>
<Line-Item>
<Id>Database </Id>
<Quantity>12</Quantity>
<Price>30,000.00</Price>
</Line-Item>
<Line-Item>
<Id>ProcessCon</Id>
<Quantity>10</Quantity>
<Price>40,000.00</Price>
</Line-Item>
</Items>
</PurchaseOrder>
<PurchaseOrder>
<Date>01/07/2004</Date>
<Buyer>EFGH Inc.</Buyer>
<Supplier>Oracle</Supplier>
<Items>
<Line-Item>
<Id>DB2 </Id>
<Quantity>12</Quantity>
<Price>30,000.00</Price>
</Line-Item>
<Line-Item>
<Id>Eclipse </Id>
<Quantity>10</Quantity>
<Price>40,000.00</Price>
</Line-Item>
</Items>
</PurchaseOrder>
<SalesOrder>
<Date>29/06/2004</Date>
<Item>Oracle Apps</Item>
<Quantity>5</Quantity>
<Buyer>Navneet Singh</Buyer>
</SalesOrder>
<PurchaseOrder>
<Date>28/06/2004</Date>
<Buyer>IJKL Inc.</Buyer>
<Supplier>Oracle</Supplier>
<Items>
<Line-Item>
<Id>Weblogic </Id>
<Quantity>50</Quantity>
<Price>70,000.00</Price>
</Line-Item>
<Line-Item>
<Id>Tuxedo </Id>
<Quantity>12</Quantity>
<Price>30,000.00</Price>
</Line-Item>
<Line-Item>
<Id>JRockit </Id>
<Quantity>10</Quantity>
<Price>40,000.00</Price>
</Line-Item>
</Items>
</PurchaseOrder>
<Invoice>
<Date>30/06/2004</Date>
<Purchaser>Navneet Singh</Purchaser>
<Seller>Oracle</Seller>
<Item>Oracle Apps</Item>
<Price>5</Price>
<Quantity>70,000.00</Quantity>
<TotalPrice>350,000.00</TotalPrice>
</Invoice>
</container>
以降の各項では、変換されるデータのフォーマット、ネイティブ・スキーマおよび変換済XMLについて説明します。
変換されるネイティブ・データ・フォーマット
PO28/06/2004^|ABCD Inc.|Oracle OracleApps025070,000.00 Database 021230,000.00 ProcessCon021040,000.00 PO01/07/2004^|EFGH Inc.|Oracle DB2 021230,000.00 Eclipse 021040,000.00 SO29/06/2004|Oracle Apps|5 Navneet Singh PO28/06/2004^|IJKL Inc.|Oracle Weblogic 025070,000.00 Tuxedo 021230,000.00 JRockit 021040,000.00 IN30/06/2004;Navneet Singh;Oracle;Oracle Apps;5;70,000.00;350,000.00
ネイティブ・スキーマ
<?xml version="1.0" encoding="US-ASCII"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
xmlns:tns="http://www.oracle.com/ias/processconnect"
targetNamespace="http://www.oracle.com/ias/processconnect"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:stream="chars"
nxsd:version="NXSD">
<element name="container">
<complexType>
<sequence maxOccurs="unbounded">
<element ref="tns:PurchaseOrder" minOccurs="0" nxsd:startsWith="PO" />
<element ref="tns:SalesOrder" minOccurs="0" nxsd:startsWith="SO" />
<element ref="tns:Invoice" minOccurs="0" nxsd:startsWith="IN" />
</sequence>
</complexType>
</element>
<!-- PO -->
<element name="PurchaseOrder" type="tns:POType"/>
<complexType name="POType">
<sequence>
<element name="Date" type="string" nxsd:style="terminated"
nxsd:terminatedBy="^" /> <element name="Buyer" type="string" nxsd:style="surrounded"
nxsd:surroundedBy="|" />
<element name="Supplier" type="string" nxsd:style="terminated"
nxsd:terminatedBy="${eol}" />
<element name="Items">
<complexType>
<sequence>
<element name="Line-Item" minOccurs="3" maxOccurs="3">
<complexType>
<group ref="tns:LineItems" />
</complexType>
</element>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
<group name="LineItems">
<sequence>
<element name="Id" type="string" nxsd:style="fixedLength" nxsd:length="10"
nxsd:padStyle="none"/>
<element name="Quantity" type="string" nxsd:style="fixedLength"
nxsd:identifierLength="2" />
<element name="Price" type="string" nxsd:style="terminated"
nxsd:terminatedBy="${eol}" />
</sequence>
</group>
<!-- SO -->
<element name="SalesOrder" type="tns:SOType" />
<complexType name="SOType">
<sequence>
<element name="Date" type="string" nxsd:style="terminated"
nxsd:terminatedBy="|" />
<element name="Item" type="string" nxsd:style="terminated"
nxsd:terminatedBy="|" />
<element name="Quantity" type="string" nxsd:style="terminated"
nxsd:terminatedBy="${eol}" />
<element name="Buyer" type="string" nxsd:style="terminated"
nxsd:terminatedBy="${eol}" /> </sequence>
</complexType>
<!-- INV -->
<element name="Invoice" type="tns:INVType" />
<complexType name="INVType">
<sequence>
<element name="Date" type="string" nxsd:style="terminated"
nxsd:terminatedBy=";" />
<element name="Purchaser" type="string" nxsd:style="terminated"
nxsd:terminatedBy=";" />
<element name="Seller" type="string" nxsd:style="terminated"
nxsd:terminatedBy=";" />
<element name="Item" type="string" nxsd:style="terminated"
nxsd:terminatedBy=";" /> <element name="Price" type="string" nxsd:style="terminated"
nxsd:terminatedBy=";" />
<element name="Quantity" type="string" nxsd:style="terminated"
nxsd:terminatedBy=";" />
<element name="TotalPrice" type="string" nxsd:style="terminated"
nxsd:terminatedBy="${eol}" />
</sequence>
</complexType>
</schema>
ネイティブ・スキーマを使用して変換したXML
<container xmlns="http://www.oracle.com/ias/processconnect">
<PurchaseOrder>
<Date>28/06/2004</Date>
<Buyer>ABCD Inc.</Buyer>
<Supplier>Oracle</Supplier>
<Items>
<Line-Item>
<Id>OracleApps</Id>
<Quantity>50</Quantity>
<Price>70,000.00</Price>
</Line-Item>
<Line-Item>
<Id>Database </Id>
<Quantity>12</Quantity>
<Price>30,000.00</Price>
</Line-Item>
<Line-Item>
<Id>ProcessCon</Id>
<Quantity>10</Quantity>
<Price>40,000.00</Price>
</Line-Item>
</Items>
</PurchaseOrder>
<PurchaseOrder>
<Date>01/07/2004</Date>
<Buyer>EFGH Inc.</Buyer>
<Supplier>Oracle</Supplier>
<Items>
<Line-Item>
<Id>DB2 </Id>
<Quantity>12</Quantity>
<Price>30,000.00</Price>
</Line-Item>
<Line-Item>
<Id>Eclipse </Id>
<Quantity>10</Quantity>
<Price>40,000.00</Price>
</Line-Item>
</Items>
</PurchaseOrder>
<SalesOrder>
<Date>29/06/2004</Date>
<Item>Oracle Apps</Item>
<Quantity>5</Quantity>
<Buyer>Navneet Singh</Buyer>
</SalesOrder>
<PurchaseOrder>
<Date>28/06/2004</Date>
<Buyer>IJKL Inc.</Buyer>
<Supplier>Oracle</Supplier>
<Items>
<Line-Item>
<Id>Weblogic </Id>
<Quantity>50</Quantity>
<Price>70,000.00</Price>
</Line-Item>
<Line-Item>
<Id>Tuxedo </Id>
<Quantity>12</Quantity>
<Price>30,000.00</Price>
</Line-Item>
<Line-Item>
<Id>JRockit </Id>
<Quantity>10</Quantity>
<Price>40,000.00</Price>
</Line-Item>
</Items>
</PurchaseOrder>
<Invoice>
<Date>30/06/2004</Date>
<Purchaser>Navneet Singh</Purchaser>
<Seller>Oracle</Seller>
<Item>Oracle Apps</Item>
<Price>5</Price>
<Quantity>70,000.00</Quantity>
<TotalPrice>350,000.00</TotalPrice>
</Invoice>
</container>
この例では日付の定義方法を示します。
変換されるネイティブ・データ
11/16/0224/11/02 11-20-2002 23*11*2002 01/02/2003 01:02 01/02/2003 03:04:05
ネイティブ・スキーマ
<?xml version="1.0" encoding="US-ASCII"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
targetNamespace="http://xmlns.oracle.com/pcbpel/nxsd/smoketest"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:stream="chars"
nxsd:version="NXSD">
<element name="dateformat">
<complexType>
<sequence>
<element name="StartDate" type="dateTime" nxsd:dateFormat="MM/dd/yy"
nxsd:style="fixedLength" nxsd:length="8" />
<element name="EndDate" type="dateTime" nxsd:dateFormat="dd/MM/yy"
nxsd:style="terminated" nxsd:terminatedBy="${eol}" />
<element name="Milestone" type="dateTime" nxsd:dateFormat="MM-dd-yyyy"
nxsd:style="terminated" nxsd:terminatedBy="${eol}" />
<element name="DueDate" type="dateTime" nxsd:dateFormat="dd*MM*yyyy"
nxsd:style="terminated" nxsd:terminatedBy="${eol}" />
<element name="Date" type="dateTime" nxsd:dateFormat="MM/dd/yyyy hh:mm"
nxsd:style="terminated" nxsd:terminatedBy="${eol}" />
<element name="Date" type="dateTime" nxsd:dateFormat="MM/dd/yyyy hh:mm:ss"
nxsd:style="terminated" nxsd:terminatedBy="${eol}" />
</sequence>
</complexType>
</element>
</schema>
ネイティブ・スキーマを使用して変換したXML
<dateformat xmlns="http://xmlns.oracle.com/pcbpel/nxsd/smoketest"> <StartDate>2002-11-16T00:00:00</StartDate> <EndDate>2002-11-24T00:00:00</EndDate> <Milestone>2002-11-20T00:00:00</Milestone> <DueDate>2002-11-23T00:00:00</DueDate> <Date>2003-01-02T01:02:00</Date> <Date>2003-01-02T03:04:05</Date> </dateformat>
注意:
既存の日付フォーマットにnxsd:dateParsingMode="lax/strict"およびロケール・サポートが追加されています。
次の例に、nxsd:dateParsingMode="lax/strict"およびロケール・サポートの使用方法を示します。
変換されるネイティブ・データ・フォーマット
11/16/0224/11/02 11-20-2002 23*11*2002 01/02/2003 01:02 01/02/2003 03:04:05 Thu, 26 May 2005 15:50:11 India Standard Time Do, 26 Mai 2005 15:43:10 Indische Normalzeit 20063202
ネイティブ・スキーマ
<?xml version="1.0" encoding="US-ASCII"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
targetNamespace="http://xmlns.oracle.com/pcbpel/nxsd/smoketest"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:stream="chars"
nxsd:version="NXSD">
<element name="dateformat">
<complexType>
<sequence>
<element name="StartDate" type="date" nxsd:dateFormat="MM/dd/yy"
nxsd:localeLanguage="en" nxsd:style="fixedLength" nxsd:length="8" />
<element name="EndDate" type="date" nxsd:dateFormat="dd/MM/yy"
nxsd:style="terminated" nxsd:terminatedBy="${eol}" />
<element name="Milestone" type="dateTime" nxsd:dateFormat="MM-dd-yyyy"
nxsd:style="terminated" nxsd:terminatedBy="${eol}" />
<element name="DueDate" type="dateTime" nxsd:dateFormat="dd*MM*yyyy"
nxsd:style="terminated" nxsd:terminatedBy="${eol}" />
<element name="Date" type="dateTime" nxsd:dateFormat="MM/dd/yyyy hh:mm"
nxsd:style="terminated" nxsd:terminatedBy="${eol}" />
<element name="Date" type="dateTime" nxsd:dateFormat="MM/dd/yyyy hh:mm:ss"
nxsd:style="terminated" nxsd:terminatedBy="${eol}" />
<element name="LongDateInEnglish" type="dateTime" nxsd:dateFormat="EEE, d
MMM yyyy HH:mm:ss zzzz" nxsd:localeLanguage="en" nxsd:localeCountry="US"
nxsd:style="terminated" nxsd:terminatedBy="${eol}" />
<element name="LongDateInGerman" type="dateTime" nxsd:dateFormat="EEE, d
MMM yyyy HH:mm:ss zzzz" nxsd:localeLanguage="de" nxsd:style="terminated"
nxsd:terminatedBy="${eol}" />
<element name="InvalidDate" type="dateTime" nxsd:dateParsingMode="lax"
nxsd:dateFormat="yyyyMMdd" nxsd:style="terminated" nxsd:terminatedBy="${eol}" />
</sequence>
</complexType>
</element>
</schema>
変換済のXML
<dateformat xmlns="http://xmlns.oracle.com/pcbpel/nxsd/smoketest"> <StartDate>2002-11-16</StartDate> <EndDate>2002-11-24</EndDate> <Milestone>2002-11-20T00:00:00</Milestone> <DueDate>2002-11-23T00:00:00</DueDate> <Date>2003-01-02T01:02:00</Date> <Date>2003-01-02T03:04:05</Date> <LongDateInEnglish>2005-05-26T15:50:11</LongDateInEnglish> <LongDateInGerman>2005-05-26T15:43:10</LongDateInGerman> <InvalidDate>2008-08-02T00:00:00</InvalidDate> </dateformat>
この例では変数の使用方法を示します。
変換されるネイティブ・データ・フォーマット
{,;}Fred,"2 Old Street, Old Town,Manchester","20-08-1954";"0161-499-1718"
phone-2
phone-3
ネイティブ・スキーマ
<?xml version="1.0" encoding="US-ASCII"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
targetNamespace="http://xmlns.oracle.com/pcbpel/nxsd/smoketest"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:stream="chars"
nxsd:version="NXSD">
<element name="variable">
<annotation>
<documentation>
1. var1 - variable declaration
2. var2 - variable declaration with default value
3. EOL - variable declaration with referencing a system variable
</documentation>
<appinfo>
<junkies/>
<nxsd:variables>
<nxsd:variable name="var1" />
<nxsd:variable name="var2" value="," />
<nxsd:variable name="SystemEOL" value="${system.line.separator}" />
</nxsd:variables>
<junkies/>
<junkies/>
<junkies/>
</appinfo>
</annotation>
<complexType>
<sequence>
<element name="delims" type="string" nxsd:style="surrounded"
nxsd:leftSurroundedBy="{" nxsd:rightSurroundedBy="}" >
<annotation>
<appinfo>
<junkies/>
<junkies/>
<junkies/>
<nxsd:variables>
<nxsd:assign name="var1" value="${0,1}"/>
<nxsd:assign name="var2" value="${1}" />
</nxsd:variables>
</appinfo>
</annotation>
</element>
<element name="PersonName" type="string" nxsd:style="terminated"
nxsd:terminatedBy="${var1}" nxsd:quotedBy=""" />
<element name="Address" type="string" nxsd:style="terminated"
nxsd:terminatedBy="${var1}" nxsd:quotedBy="""/>
<element name="DOB" type="string" nxsd:style="terminated"
nxsd:terminatedBy="${var2}" nxsd:quotedBy='"'/>
<element name="Telephone1" type="string" nxsd:style="terminated"
nxsd:terminatedBy="${eol}" nxsd:quotedBy='"'/>
<element name="Telephone2" type="string" nxsd:style="terminated"
nxsd:terminatedBy="${eol}" nxsd:quotedBy='"'/>
<element name="Telephone3" type="string" nxsd:style="terminated"
nxsd:terminatedBy="${eol}" nxsd:quotedBy='"'/>
</sequence>
</complexType>
</element>
</schema>
ネイティブ・スキーマを使用して変換したXML
<variable xmlns="http://xmlns.oracle.com/pcbpel/nxsd/smoketest"> <delims>,;</delims> <PersonName>Fred</PersonName> <Address>2 Old Street, Old Town,Manchester</Address> <DOB>20-08-1954</DOB> <Telephone1>0161-499-1718</Telephone1> <Telephone2>phone-2</Telephone2> <Telephone3>phone-3</Telephone3> </variable>
ネイティブ・フォーマットでは、データが読み取られるときに、次の例に示すように、指定のデータに接頭辞または接尾辞、あるいはその両方が追加されます。
変換されるネイティブ・データ
Fred, "2 Old Street, Old Town,Manchester","20-08-1954",0161-499-1718
ネイティブ・スキーマ
<?xml version="1.0" encoding="US-ASCII"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
targetNamespace="http://xmlns.oracle.com/pcbpel/nxsd/smoketest"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:stream="chars"
nxsd:version="NXSD"
>
<element name="terminated">
<complexType>
<sequence>
<element name="PersonName" type="string" nxsd:prefixWith="Mr."
nxsd:style="terminated" nxsd:terminatedBy="," nxsd:quotedBy=""" />
<element name="Address" type="string" nxsd:suffixWith="]]"
nxsd:prefixWith="[[" nxsd:style="terminated" nxsd:terminatedBy=","
nxsd:quotedBy="""/>
<element name="DOB" type="string" nxsd:style="terminated"
nxsd:terminatedBy="," nxsd:quotedBy='"'/>
<element name="Telephone" type="string" nxsd:style="terminated"
nxsd:terminatedBy="${eol}" nxsd:quotedBy='"'/>
</sequence>
</complexType>
</element>
</schema>
ネイティブ・スキーマを使用して変換したXML
<terminated xmlns="http://xmlns.oracle.com/pcbpel/nxsd/smoketest"> <PersonName>Mr.Fred</PersonName> <Address>[[2 Old Street, Old Town,Manchester]]</Address> <DOB>20-08-1954</DOB> <Telephone>0161-499-1718</Telephone> </terminated>
トランスレータは、次の例に示すように、skipModeコンストラクトに応じてデータの読取り前または読取り後にスキップします。
変換されるネイティブ・データ
Fred, "2 Old Street, Old Town,Manchester","20-08-1954",0161-499-1718
ネイティブ・スキーマ
<?xml version="1.0" encoding="US-ASCII"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
targetNamespace="http://xmlns.oracle.com/pcbpel/nxsd/smoketest"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:stream="chars"
nxsd:version="NXSD"
>
<element name="terminated">
<complexType>
<sequence>
<element name="PersonName" type="string" nxsd:skip="5"
nxsd:style="terminated" nxsd:terminatedBy="," nxsd:quotedBy=""" />
<element name="Address" type="string" nxsd:skipMode="before" nxsd:skip="3"
nxsd:style="terminated" nxsd:terminatedBy="," nxsd:quotedBy="""/>
<element name="DOB" type="string" nxsd:skipMode="after" nxsd:skip="6"
nxsd:style="terminated" nxsd:terminatedBy="," nxsd:quotedBy='"'/>
<element name="Telephone" type="string" nxsd:style="terminated"
nxsd:terminatedBy="${eol}" nxsd:quotedBy='"'/>
</sequence>
</complexType>
</element>
</schema>
ネイティブ・スキーマを使用して変換したXML
<terminated xmlns="http://xmlns.oracle.com/pcbpel/nxsd/smoketest"> <PersonName>Fred</PersonName> <Address>2 Old Street, Old Town,Manchester</Address> <DOB>20-08-1954</DOB> <Telephone>99-1718</Telephone> </terminated>
nxsd注釈を付けずに要素を宣言し、値fixedまたはdefaultを指定すると、トランスレータは指定された値を使用し、例外をスローしません。
変換されるネイティブ・データ
Fred,"2 Old Street, Old Town,Manchester","20-08-1954","0161-499-1718"
ネイティブ・スキーマ
<?xml version="1.0" encoding="US-ASCII"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
targetNamespace="http://xmlns.oracle.com/pcbpel/nxsd/smoketest"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:stream="chars"
nxsd:version="NXSD">
<element name="terminated">
<annotation>
<appinfo>
<nxsd:variables>
<nxsd:variable name="x" value="hello" />
</nxsd:variables>
<junkies/>
<junkies/>
<junkies/>
</appinfo>
</annotation>
<complexType>
<sequence>
<element name="PersonName" type="string" nxsd:style="terminated"
nxsd:terminatedBy="," nxsd:quotedBy=""" />
<element name="Age" type="string" fixed="16" />
<element name="Address" type="string" nxsd:style="terminated"
nxsd:terminatedBy="," nxsd:quotedBy="""/>
<element name="DOB" type="string" nxsd:style="terminated"
nxsd:terminatedBy="," nxsd:quotedBy='"'/>
<element name="salutation" type="string" default="${x}" />
<element name="Telephone" type="string" nxsd:style="terminated"
nxsd:terminatedBy="${eol}" nxsd:quotedBy='"'/>
</sequence>
</complexType>
</element>
</schema>
ネイティブ・スキーマを使用して変換したXML
<terminated xmlns="http://xmlns.oracle.com/pcbpel/nxsd/smoketest"> <PersonName>Fred</PersonName> <Age>16</Age> <Address>2 Old Street, Old Town,Manchester</Address> <DOB>20-08-1954</DOB> <salutation>hello</salutation> <Telephone>0161-499-1718</Telephone> </terminated>
writeコンストラクトは、実際のデータの書込み前または書込み後に、出力ストリームの現在位置にリテラルを書き込みます。
入力XML
<terminated xmlns="http://xmlns.oracle.com/pcbpel/nxsd/smoketest"> <PersonName>Fred</PersonName> <Address>2 Old Street, Old Town,Manchester</Address> <DOB>20-08-1954</DOB> <Telephone>0161-499-1718</Telephone> </terminated>
ネイティブ・スキーマ
<?xml version="1.0" encoding="US-ASCII"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
targetNamespace="http://xmlns.oracle.com/pcbpel/nxsd/smoketest"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:stream="chars"
nxsd:version="NXSD"
>
<element name="terminated">
<complexType>
<sequence>
<element name="PersonName" type="string" nxsd:writeMode="before"
nxsd:write="Mr." nxsd:style="terminated" nxsd:terminatedBy=","
nxsd:quotedBy=""" />
<element name="Address" type="string" nxsd:writeMode="after"
nxsd:write="Over." nxsd:style="terminated" nxsd:terminatedBy=","
nxsd:quotedBy="""/>
<element name="DOB" type="string" nxsd:style="terminated"
nxsd:terminatedBy="," nxsd:quotedBy='"'/>
<element name="Telephone" type="string" nxsd:style="terminated"
nxsd:terminatedBy="${eol}" nxsd:quotedBy='"'/>
</sequence>
</complexType>
</element>
</schema>
ネイティブ・スキーマを使用して変換したデータ
Mr.Fred,"2 Old Street, Old Town,Manchester",Over.20-08-1954,0161-499-1718
LookAheadコンストラクトには次のタイプがあります。
タイプ1: LookAhead X charsは、スタイルを使用して位置から値を読み取り、指定のリテラルと照合します。
タイプ2: LookAhead X charsは、スタイルを使用して位置から値を読み取り、その値を後で使用できるように変数に格納します。
LookAhead X charsは、スタイルを使用して位置から値を読み取り、指定のリテラルと照合します。
変換されるネイティブ・データ・フォーマット
Fred,"2 Old Street, Old Town,Manchester","20-08-1954","0161-499-1718",YES
ネイティブ・スキーマ
<?xml version="1.0" encoding="US-ASCII"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
targetNamespace="http://xmlns.oracle.com/pcbpel/nxsd/smoketest"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:stream="chars"
nxsd:version="NXSD">
<element name="LookAhead">
<complexType>
<sequence minOccurs="0" nxsd:lookAhead="70" nxsd:lookFor="YES">
<element name="PersonName" type="string" nxsd:style="terminated"
nxsd:terminatedBy="," nxsd:quotedBy=""" />
<element name="Address" type="string" nxsd:style="terminated"
nxsd:terminatedBy="," nxsd:quotedBy="""/>
<element name="DOB" type="string" nxsd:style="terminated"
nxsd:terminatedBy="," nxsd:quotedBy='"'/>
<element name="Telephone" type="string" nxsd:style="terminated"
nxsd:terminatedBy="," nxsd:quotedBy='"'/>
</sequence>
</complexType>
</element>
</schema>
ネイティブ・スキーマを使用して変換したXML
<LookAhead xmlns="http://xmlns.oracle.com/pcbpel/nxsd/smoketest"> <PersonName>Fred</PersonName> <Address>2 Old Street, Old Town,Manchester</Address> <DOB>20-08-1954</DOB> <Telephone>0161-499-1718</Telephone> </LookAhead>
ネイティブ・スキーマではLookAhead X charsは、スタイルを使用して位置から値を読み取り、その値を後で使用できるように変数に格納します。
変換されるネイティブ・データ・フォーマット
Name1,"2 Old Street, Old Town,Manchester",20-08-1954,"0161-499-1718", YES Name2,"2 Old Street, Old Town,Manchester",20-08-1954,"0161-499-1718", NO Name3,"2 Old Street, Old Town,Manchester",20-08-1954,"0161-499-1718", NO Name4,"2 Old Street, Old Town,Manchester",20-08-1954,"0161-499-1718", YES
ネイティブ・スキーマ
<?xml version="1.0" encoding="US-ASCII"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
targetNamespace="http://xmlns.oracle.com/pcbpel/nxsd/smoketest"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:stream="chars"
nxsd:version="NXSD">
<!--
nxsd:lookAhead="70" nxsd:scan="3"
-->
<element name="LookAhead">
<complexType>
<choice maxOccurs="unbounded" nxsd:choiceCondition="${x}" nxsd:lookAhead="70"
nxsd:scanLength="3" nxsd:assignTo="${x}">
<element name="Record1" type="string" nxsd:conditionValue="YES"
nxsd:style="terminated" nxsd:terminatedBy="," nxsd:skipMode="after"
nxsd:skipUntil="${eol}" />
<element name="Record2" type="string" nxsd:conditionValue="NO "
nxsd:style="terminated" nxsd:terminatedBy="," nxsd:skipMode="after"
nxsd:skipUntil="${eol}" />
</choice>
</complexType>
</element>
</schema>
ネイティブ・スキーマを使用して変換したXML
<LookAhead xmlns="http://xmlns.oracle.com/pcbpel/nxsd/smoketest"> <Record1>Name1</Record1> <Record2>Name2</Record2> <Record2>Name3</Record2> <Record1>Name4</Record1> </LookAhead>
NXSDウィザードは、固定長レコードと可変長レコードの両方をフィルタリングするための正規表現パターンを指定できるlookahead属性を提供します。
固定長、デリミタ付きおよび複合ファイル・タイプでlookahead属性を使用することで、条件付き処理がサポートされます。
この条件付き処理を使用すると、正規表現を満たすレコードのみがXMLでパブリッシュされる結果を取得できます。
また、レコードが正規表現を満たさない場合に例外を発生するオプションも指定できます。選択条件を指定することによって条件付き処理がサポートされます。
正規表現のサポートによって、正規表現と照合する文字列を指定できます。文字列はレコード境界を超えることはできません。
固定長レコードでは、レコード長とレコードの様々なフィールドがあらかじめわかっています。このことは、正規表現と照合するストリームの開始位置と長さを指定する際に役立ちます。
固定長レコードのnxsdコンストラクトとその定義のリストは、表6-6を参照してください。
コンストラクトは、nxsd:の形式で提供されますが、ネイティブ・フォーマット・ビルダーのユーザー・インタフェースと同等の役割を果たし、ネイティブ・フォーマット・ビルダー・ウィザードの該当する画面の説明で参照されます。
表6-6 固定長レコードのLookAheadコンストラクト
| 構文 | 説明 |
|---|---|
nxsd:lookAhead |
入力ストリームの現在の位置よりも先の一致を検索します。一致が検出されると、このコンストラクトが指定されているレコードが処理され、検出されない場合はスキップされます。この機能は次のように使用します。
これは、20文字をスキップし、次の30文字の中で このコンストラクトは、 |
|
入力ストリームと照合する正規表現 |
|
lookAheadの後の入力ストリームのデータ長を指定します。このデータは |
|
データとlookForPatternが一致しないとエラーを発生するかどうかについて、ブール値を指定します。デフォルト値はfalseで、データとlookForPatternが一致しない場合にエラーを発生せず、不一致のレコードをスキップします。この場合、不一致のレコードは処理されず、データの喪失としてユーザーに表示されることがあります。 |
次の使用例を参照してください。
nxsd:scanLengthを指定しない場合は、uniqueMessageSeparatorを使用して文字列が特定されます。
uniqueMessageSeparatorは、大量のメッセージにおいて、ネイティブ・データの一意のメッセージ・セパレータを指定する文字列です。uniqueMessageSeparatorが指定されていない場合、デフォルトの${eol}が使用されます。
次のシナリオでは、nxsd:scanLengthが指定されていないため、トランスレータはuniqueMessageSeparatorを使用して正規表現と照合する文字列を特定します。
アドレスがNew Townのすべてのレコードをスキャンします。ネイティブ・データは次のとおりです。
#Fred,"2 Old Street, Old Town, Manchester","17-08-1954","0161-498-1718", YES #Tred,"2 Old Street, Old Town, Manchester","16-08-1974","0161-486-1718", YES John,"2 Old Street, New Town, Manchester","20-08-2004","0161-497-1718", NO #
これに対するNXSDは次のとおりで、文字列を特定するためにuniqueMessageSeparatorを使用します。
<schema … nxsd:uniqueMessageSeparator="#"> <sequence minOccurs="0" maxOccurs="unbounded" nxsd:lookAhead="0" nxsd:lookForPattern="*New Town*">
アドレスがNew Townで、nxsd:uniqueMessageSeparatorが指定されていないすべてのレコードをスキャンします。トランスレータは${eol}を使用して、正規表現と照合する文字列を特定します。
Fred,"2 Old Street, Old Town, Manchester","17-08-1954","0161-498-1718", YES Tred,"2 Old Street, Old Town, Manchester","16-08-1974","0161-486-1718", YES John,"2 Old Street, New Town, Manchester","20-08-2004","0161-497-1718", NAH
これに対するNXSDは次のとおりです。
<sequence minOccurs="0" maxOccurs="unbounded" nxsd:lookAhead="0" nxsd:lookForPattern="*New Town*">
次の使用例では、nxsd:uniqueMessageSeparatorを使用しません。
2つ目の使用例では、文字列を特定するためにnxsd:scanLengthを指定します。
Fred,"2 Old Street, New Town, Manchester","17-08-1954","0161-498-1718", YES Tred,"2 Old Street, Old Town, Manchester","16-08-1974","0161-486-1718", YES John,"2 Old Street, New Town, Manchester","20-08-2004","0161-497-1718", NAH
このデータに対して使用するNXSDは次のとおりです。
<sequence minOccurs="0" maxOccurs="3" nxsd:lookAhead="0" nxsd:lookForPattern=".*New Town.*" nxsd:scanLength="73">
2つ目のフィールドが数字のみで構成されるすべてのレコードをスキャンします。ネイティブ・データは次のとおりです。
Fred, add, 20-08-1954, 0161-498-1718", YES Tred, 100, 20-08-1954, 0161-486-1718", YES John, add, 20-08-1954, 0161-497-1718", NAH
2つ目のフィールドが数字のみで構成されるかどうかを特定するNXSDは次のとおりです。
<sequence minOccurs="0" maxOccurs="3" nxsd:lookAhead="0" nxsd:lookForPattern=".*,\d+,.*" nxsd:scanLength="38">
zipに5桁の数字のみが含まれるすべてのレコードをスキャンします。ネイティブ・データは次のとおりです。
Fred, zipID, 20-08-1954, 0161-498-1718", YES Tred, 90210, 20-08-1954, 0161-486-1718", YES John, 9021Z, 20-08-1954, 0161-497-1718", NAH
適切なパターンを検索し、5桁の数字を特定するNXSDは次のとおりです。
<sequence minOccurs="0" maxOccurs="3" nxsd: lookAhead="0" nxsd:lookForPattern=".*,\d{5},.*" nxsd:scanLength="40">
名前に数字が含まれず、2つ目のフィールドに5桁のzipコードが含まれるすべてのレコードをスキャンします。ネイティブ・データは次のとおりです。
JohnBrown, zipID, 20-08-1954, 0161-498-1718", YES Sweety101, 90210, 20-08-1954, 0161-486-1718", YES CrowyBowy, 90210, 20-08-1954, 0161-497-1718", NAH
正規表現の使用に対するこのNXSDは次のとおりです。
<sequence minOccurs="0" maxOccurs="4" nxsd:lookAhead="0" nxsd:lookForPattern="[a-zA-Z]*,\d{5},.*" nxsd:scanLength="45">
スキャンの長さの使用は固定長レコードで適切に機能しますが、可変長レコードには、長さが事前にわからないという制限があります。そのため、nxsd:scanLength属性をこのようなシナリオで使用することはできません。トランスレータには、正規表現と照合する文字列を特定する方法が必要です。
可変長レコードのこの制限に対処するには、複雑なlookaheadを実行するときに、nxsd:scanLengthを使用するのではなく、2つの属性(nxsd:LookFromおよびnxsd:lookTill)を使用できます。
パターンが一致する文字列は、nxsd:lookFrom属性およびnxsd:lookTill属性を介して導出できます。可変長レコードのlookaheadスキャンに対する基本NXSDは、次のとおりです。
nxsd:lookFrom="FirstInstanceOfString" nxsd:lookTill="firstInstanceOfString after lookFrom"
nxsd:lookForPattern="java.util.regex.Pattern" [nxsd:skipUntill="${eol} or Literal"]
可変長レコードのlookaheadコンストラクトのリストは、表6-7を参照してください。
コンストラクトは、nxsd:の形式で提供されますが、ネイティブ・フォーマット・ビルダーのユーザー・インタフェースと同等の役割を果たし、該当する画面の説明で参照されます。
表6-7 可変長レコードのlookaheadコンストラクト
| 構文 | 定義 |
|---|---|
|
リテラルを定義します。 |
|
入力ストリームと照合する |
|
入力ストリームのデータ照合の終点となるリテラルを指定します。 |
|
データがlookForPatternと一致しないときに、入力ストリームのデータのスキップの終点となるリテラルを指定します。 |
|
データが |
ネイティブ・ファイルを変換するためのNXSDを作成する場合、スキーマでlookAheadを指定すると、lookForPatternを使用して指定した正規表現に基づいて値を抽出できます。
ただし、可変長レコードを抽出する場合は、レコードの長さがわからないため、NXSD要素でlookFrom属性とlookTill属性を使用できます。JDeveloperネイティブ・フォーマット・ビルダーのユーザー・インタフェース・ウィンドウで、skipUntilを使用するか、または使用せずにlookFromおよびlookTillに値を指定します。
複雑なlookaheadを可変長レコードとともに使用する場合、これらのコンストラクトの理解に関連する使用例がいくつかあります。
1つ目の使用例では、nxsd:lookTillがレコードの終わりであり、New Townにアドレスがあるレコードをすべてスキャンします。この例では、スキーマ要素のカーディナリティを超過せず、nxsd:lookForPatternが一致しない場合に、トランスレータがスキップ位置を認識している必要があります。
Tred,"2 Old Street, NEW Town,Manchester",@NAH Bred,"2 Old Street, Old Town,Manchester",@NAH dred,"2 Old Street, New Town,Manchester",@YES Hred,"2 Old Street, Old Town,Manchester",@YES Bred,"2 Old Street, Old Town,Manchester",@YES
この使用例に対するNXSDは次のとおりです。nxsd:lookTill="${eol}によってレコードの最後を示し、New Townを検索することを示しています。
<sequence minOccurs="0" maxOccurs="3" nxsd:lookFrom="Street" nxsd:lookTill="${eol}" nxsd:lookForPattern=".*New Town.*">
nxsd:lookTillがレコードの終わりではない使用例もあります。この例では、トランスレータは、レコードが一致しない場合にスキップ位置を認識していません。
nxsd:skipUntil属性を使用すると、レコードが情報と一致しない場合にスキップ位置を指定できます。
nxsd:lookTill句とともにnxsd:skipUntil句を明示的に定義する必要があります。
nxsd:skipUntilを使用する場合は、次のようにレコードの終わりを指定します。
nxsd:skipUntil=" ${eol} or Literal"
この使用例では、New Townにアドレスがあるすべてのレコードをスキャンします。ネイティブ・データは次のとおりです。
Tred,"2 Old Street, NEW Town, Manchester", @NAH Bred,"2 Old Street, Old Town, Manchester", @NAH Dred, "2 Old Street, New Town, Manchester", @YES Hred,"2 Old Street, Old Town, Manchester", @YES Bred,"2 Old Street, Old Town, Manchester", @YES
次のNXSDは、レコードが一致しない場合にファイルの終わりまでスキップしますが、Manchesterが見つかるまで検索を行うことを示しています。
<sequence minOccurs="0" maxOccurs="3" nxsd:lookFrom="Street" nxsd:lookTill=" Manchester" nxsd:lookForPattern=".*New Town.*" nxsd:skipUntil="${eol}">
事前定義された位置から、特定の文字列が見つかる位置まで正規表現を照合することもできます。そのためには、nxsd:lookTill属性とともにnxsd:lookAheadを使用して開始位置を指定します。
これは、nxsd:lookFrom属性については不明であるが、レコードの終わりがわかっているシナリオで役立ちます。
そのようなシナリオでは、nxsd:lookAhead="0"とnxsd:lookTill="end of record"を指定できます。この場合、レコードの終わりまでnxsd:lookTillを指定する必要があります。
次の例では、New Townにアドレスがあるすべてのレコードをスキャンします。ネイティブ・データは次のとおりです。
Tred,"2 Old Street, NEW Town, Manchester", @NAHBred,"2 Old Street, Old Town, Manchester", @NAHDred,"2 Old Street, New Town, Manchester", @YESHred,"2 Old Street, Old Town, Manchester", @YESBred,"2 Old Street, Old Town, Manchester", @YES
レコードの終わりがわかっているこの使用例のNXSDは、次のとおりです。
<sequence minOccurs="0" maxOccurs="3" nxsd:lookAhead="0" nxsd:lookForPattern=".*New Town.*" nxsd:lookTill="${eol}">
nxsd:lookTillがレコードの終わりではない例もあります。nxsd:skipUntilを指定する必要があります。これは、特定の正規表現と一致しないレコードをトランスレータがスキップする必要があるポイントを示します。
次の例では、New Townにアドレスがあるすべてのレコードをスキャンします。
Tred,"2 Old Street, NEW Town, Manchester", @NAH Bred,"2 Old Street, Old Town, Manchester", @NAH Dred,"2 Old Street, New Town, Manchester", @YES Hred,"2 Old Street, Old Town, Manchester", @YES Bred,"2 Old Street, Old Town, Manchester", @YES
nxsd:skipUntilがレコードの終わりを定義している場合のNXSDは、次のとおりです。
<sequence minOccurs="0" maxOccurs="3" nxsd:lookAhead="0" nxsd:lookForPattern=".*New Town.*" nxsd:lookTill="Manchester" nxsd:skipUntil="${eol}">
JDeveloperネイティブ・フォーマット・ビルダーのユーザー・インタフェース・ウィンドウで、skipUntilを使用するか、使用せずにlookAheadとlookTillに値を指定できますが、JDeveloper UIでそれらを選択して次に進み、NXSDソースを表示すると、スキーマにlookTill属性が含まれません。この問題を防ぐには、lookAhead属性とともに<namespace>:lookTill="literal"を明示的に記述します。
改行文字があるレコードの各行では、文の最後の単語を見つけるために複雑なLookAheadパターンを定義する場合に、改行文字をcharとして含める必要があります。
たとえば、次のレコードを検索する場合、
canvas,"1 17th Cross, North London,England","17-08-1954","0161-498-1718",YES
検索用のパターンとして次を使用できると考えるかもしれません。
nxsd:lookAhead="73" nxsd:scanLength="3" nxsd:lookForPattern=".ES"
しかし、検索するレコードが実際は改行文字を含む次の内容の場合、
canvas,"1 17th Cross, North London,England","17-08-1954","0161-498-1718",YES\n
このレコードを検索するlookForPattern句は、次のようにする必要があります。
nxsd:lookForPattern=".ES\n"
または、デリミタに対応する場合は、次のようにします。
nxsd:lookForPattern=".ES."
そのため、属性は次のようになります。
nxsd:lookAhead="73" nxsd:scanLength="4" nxsd:lookForPattern=".ES\n" or nxsd:lookForPattern=".ES."
outboundHeaderの実際の内容には変数(特に${eol})を使用できます。headerLinesおよびoutboundHeaderの両方が使用可能な場合、アウトバウンドではoutboundHeaderが優先されます。
注意:
インバウンド方向では、ヘッダー・スキップ機能がサポートされています。他の変数はアクセスできないか、リテラルのみが含まれているため、ヘッダーで使用できるのは事前定義済の変数のみです。
入力XML
<terminated xmlns="http://xmlns.oracle.com/pcbpel/nxsd/smoketest"> <PersonName>Fred</PersonName> <Address>2 Old Street, Old Town,Manchester</Address> <DOB>20-08-1954</DOB> <Telephone>0161-499-1718</Telephone> </terminated>
ネイティブ・スキーマ
<?xml version="1.0" encoding="US-ASCII"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
targetNamespace="http://xmlns.oracle.com/pcbpel/nxsd/smoketest"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:stream="chars"
nxsd:version="NXSD"
nxsd:hasHeader="true"
nxsd:outboundHeader="This is a header ${eol}">
<element name="terminated">
<complexType>
<sequence>
<element name="PersonName" type="string" nxsd:style="terminated"
nxsd:terminatedBy="," nxsd:quotedBy=""" />
<element name="Address" type="string" nxsd:style="terminated"
nxsd:terminatedBy="," nxsd:quotedBy="""/>
<element name="DOB" type="string" nxsd:style="terminated"
nxsd:terminatedBy="," nxsd:quotedBy='"'/>
<element name="Telephone" type="string" nxsd:style="terminated"
nxsd:terminatedBy="${eol}" nxsd:quotedBy='"'/>
</sequence>
</complexType>
</element>
</schema>
変換されたデータ
This is a header Fred,"2 Old Street, Old Town,Manchester",20-08-1954,0161-499-1718
choiceConditionコンストラクトとともにconditionValueコンストラクトを使用すると、ブール演算子ANDおよびORとともに「等しい」(==)または「等しくない」(!=)などの一致基準を指定して、読み取った値とconditionValueコンストラクトに指定した値を比較できます。
変換されるネイティブ・データ・フォーマット
Order, ID41678, 20May2000 Item1, GigaWidget, 60, $75 Item2, MegaBucket, 48, $125 Cust1, Hopkins Associates, ID26490 Order, ID41680, 20May2000 Item3, Rt.Clopper, 40, $100 Item4, Lt.Clopper, 50, $100 Cust2, Jersey WebInovaters, ID46786
ネイティブ・スキーマ
<?xml version="1.0" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
targetNamespace="http://xmlns.oracle.com/pcbpel/nxsd/extensions/SampleNS"
xmlns:tns="http://xmlns.oracle.com/pcbpel/nxsd/extensions/SampleNS"
elementFormDefault="qualified"
attributeFormDefault="unqualified" nxsd:encoding="US-ASCII"
nxsd:stream="chars" nxsd:version="NXSD">
<xsd:element name="Container">
<xsd:complexType>
<xsd:choice minOccurs="1" maxOccurs="unbounded"
nxsd:choiceCondition="terminated" nxsd:terminatedBy=",">
<xsd:element name="Customer" nxsd:conditionValue="(== Cust1) or (== Cust2)
and (!= emp)">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="C1" type="xsd:string" nxsd:style="terminated"
nxsd:terminatedBy="," nxsd:quotedBy=""">
</xsd:element>
<xsd:element name="C2" type="xsd:string" nxsd:style="terminated"
nxsd:terminatedBy="${eol}" nxsd:quotedBy=""">
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Item" nxsd:conditionValue="(== Item1) or (== Item2) or
(==Item3) or (== Item4)">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="C1" type="xsd:string" nxsd:style="terminated"
nxsd:terminatedBy="," nxsd:quotedBy=""">
</xsd:element>
<xsd:element name="C2" type="xsd:string" nxsd:style="terminated"
nxsd:terminatedBy="," nxsd:quotedBy=""">
</xsd:element>
<xsd:element name="C3" type="xsd:string" nxsd:style="terminated"
nxsd:terminatedBy="${eol}" nxsd:quotedBy=""">
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Order" nxsd:conditionValue="Order">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="C1" type="xsd:string" nxsd:style="terminated"
nxsd:terminatedBy="," nxsd:quotedBy=""">
</xsd:element>
<xsd:element name="C2" type="xsd:string" nxsd:style="terminated"
nxsd:terminatedBy="${eol}" nxsd:quotedBy=""">
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
ネイティブ・スキーマを使用して変換したXML
<Container xmlns="http://xmlns.oracle.com/pcbpel/nxsd/extensions/SampleNS">
<Order>
<C1> ID41678</C1>
<C2> 20May2000</C2>
</Order>
<Item>
<C1> GigaWidget</C1>
<C2> 60</C2>
<C3> $75</C3>
</Item>
<Item>
<C1> MegaBucket</C1>
<C2> 48</C2>
<C3> $125</C3>
</Item>
<Customer>
<C1> Hopkins Associates</C1>
<C2> ID26490</C2>
</Customer>
<Order>
<C1> ID41680</C1>
<C2> 20May2000</C2>
</Order>
<Item>
<C1> Rt.Clopper</C1>
<C2> 40</C2>
<C3> $100</C3>
</Item>
<Item>
<C1> Lt.Clopper</C1>
<C2> 50</C2>
<C3> $100</C3>
</Item>
<Customer>
<C1> Jersey WebInovaters</C1>
<C2> ID46786</C2>
</Customer>
</Container>
choiceConditionコンストラクトは、フィールドが複数タイプのデリミタで区切られている複雑なレコードに対し、conditionValueコンストラクトとともに使用されます。複数タイプ以外にchoiceConditionに使用できるタイプは、FixedLength、VariableおよびAd hocです。次の例に、variableタイプのchoiceConditionを示します。
変換されるネイティブ・データ・フォーマット
Name1,"2 Old Street, Old Town,Manchester",20-08-1954,"0161-499-1718", YES Name2,"2 Old Street, Old Town,Manchester",20-08-1954,"0161-499-1718", NO
ネイティブ・スキーマ
<element name="LookAhead">
<complexType>
<choice maxOccurs="unbounded" nxsd:choiceCondition="${x}" nxsd:lookAhead="70" nxsd:scanLength="3" nxsd:assignTo="${x}">
<element name="Record1" type="string" nxsd:conditionValue="YES" nxsd:style="terminated" nxsd:terminatedBy="," nxsd:skipMode="after" nxsd:skipUntil="${eol}" />
<element name="Record2" type="string" nxsd:conditionValue="NO " nxsd:style="terminated" nxsd:terminatedBy="," nxsd:skipMode="after" nxsd:skipUntil="${eol}" />
</choice>
</complexType>
</element>
ネイティブ・スキーマを使用して変換したXML
<LookAhead xmlns="http://xmlns.oracle.com/pcbpel/nxsd/smoketest"> <Record1>Name1</Record1> <Record2>Name2</Record2> </LookAhead>
データ全体ではなくデータの一部のみを変換することが要件の場合は、dataLinesコンストラクトを使用して、ファイルの先頭を基準として無視する行数とその位置から変換する行数を指定できます。
変換されるネイティブ・データ・フォーマット
Fred,addr,20-08-1954,0161-499-1718 Tam,addr,20-08-1954,0161-499-1718 Albert,addr,20-08-1954,0161-499-1718 Bill,addr,20-08-1954,0161-499-1718 Phil,addr,20-08-1954,0161-499-1718
ネイティブ・スキーマ
<?xml version="1.0" encoding="US-ASCII"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
targetNamespace="http://xmlns.oracle.com/pcbpel/nxsd/smoketest"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:stream="chars"
nxsd:version="NXSD"
nxsd:headerLines="1"
nxsd:dataLines="1">
<element name="terminated">
<complexType>
<sequence maxOccurs="unbounded">
<element name="PersonName" type="string" nxsd:style="terminated"
nxsd:terminatedBy="," />
<element name="Address" type="string" nxsd:style="terminated"
nxsd:terminatedBy="," />
<element name="DOB" type="string" nxsd:style="terminated"
nxsd:terminatedBy="," />
<element name="Telephone" type="string" nxsd:style="terminated"
nxsd:terminatedBy="${eol}" />
</sequence>
</complexType>
</element>
</schema>
ネイティブ・スキーマを使用して変換したXML
<terminated xmlns="http://xmlns.oracle.com/pcbpel/nxsd/smoketest"> <PersonName>Tam</PersonName> <Address>addr</Address> <DOB>20-08-1954</DOB> <Telephone>0161-499-1718</Telephone> </terminated>
トランスレータでは、日付または時刻がタイムゾーンに関連付けられている必要があります。トランスレータでは、ネイティブ・データの日付とXMLの日付の両方について、タイムゾーンを使用した日付書式がサポートされています。
日付/時間文字列の変換時には、2つの部分があります。第1の部分はネイティブ・データの日付の書式(dateformat)で、第2の部分は第1の部分の解析に使用するタイムゾーン(timeZoneまたはuseTimeZone)です。トランスレータでは、これらの詳細が日付/時間文字列の解析中に使用されます。
デフォルトでは、解析後に日付文字列がXMLのISO-8601フォーマットに変換されます。このデフォルトは、XMLDateFormatとXMLTimeZoneまたはuseTimeZoneを使用してオーバーライドできます。
変換されるネイティブ・データ・フォーマット
11/16/0224/11/02 11-20-2002 23*11*2002 01/02/2003 01:02 01/02/2003 03:04:05 Thu, 26 May 2005 15:50:11 India Standard Time Do, 26 Mai 2005 15:43:10 Indische Normalzeit 20063202 11/16/02
ネイティブ・スキーマ
<?xml version="1.0" encoding="US-ASCII"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
targetNamespace="http://xmlns.oracle.com/pcbpel/nxsd/smoketest"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:stream="chars"
nxsd:version="NXSD">
<element name="dateformat">
<complexType>
<sequence>
<element name="StartDate" type="date" nxsd:dateFormat="MM/dd/yy"
nxsd:localeLanguage="en" nxsd:style="fixedLength" nxsd:length="8" />
<element name="EndDate" type="date" nxsd:dateFormat="dd/MM/yy"
nxsd:style="terminated" nxsd:terminatedBy="${eol}" />
<element name="Milestone" type="dateTime" nxsd:useTimeZone="UTC"
nxsd:dateFormat="MM-dd-yyyy" nxsd:style="terminated" nxsd:terminatedBy="${eol}" />
<element name="DueDate" type="dateTime" nxsd:useTimeZone="UTC"
nxsd:dateFormat="dd*MM*yyyy" nxsd:style="terminated" nxsd:terminatedBy="${eol}" />
<element name="Date" type="dateTime" nxsd:useTimeZone="UTC"
nxsd:dateFormat="MM/dd/yyyy hh:mm" nxsd:style="terminated"
nxsd:terminatedBy="${eol}" />
<element name="Date" type="dateTime" nxsd:useTimeZone="UTC"
nxsd:dateFormat="MM/dd/yyyy hh:mm:ss" nxsd:style="terminated"
nxsd:terminatedBy="${eol}" />
<element name="LongDateInEnglish" type="dateTime"
nxsd:displayTimeZone="true" nxsd:useTimeZone="IST" nxsd:dateFormat="EEE, d MMM
yyyy HH:mm:ss zzzz" nxsd:localeLanguage="en" nxsd:localeCountry="US"
nxsd:style="terminated" nxsd:terminatedBy="${eol}" />
<element name="LongDateInGerman" type="dateTime"
nxsd:displayTimeZone="true" nxsd:useTimeZone="IST" nxsd:dateFormat="EEE, d MMM
yyyy HH:mm:ss zzzz" nxsd:localeLanguage="de" nxsd:style="terminated"
nxsd:terminatedBy="${eol}" />
<element name="InvalidDate" type="dateTime" nxsd:useTimeZone="UTC"
nxsd:dateParsingMode="lax" nxsd:dateFormat="yyyyMMdd" nxsd:style="terminated"
nxsd:terminatedBy="${eol}" />
<element name="MyFormatDate" type="string" nxsd:dateFormat="MM/dd/yy"
nxsd:xmlDateFormat="dd-MM-yyyy" nxsd:localeLanguage="en" nxsd:style="fixedLength"
nxsd:length="8" />
</sequence>
</complexType>
</element>
</schema>
ネイティブ・スキーマを使用して変換したXML
<dateformat xmlns="http://xmlns.oracle.com/pcbpel/nxsd/smoketest"> <StartDate>2002-11-16</StartDate> <EndDate>2002-11-24</EndDate> <Milestone>2002-11-20T00:00:00</Milestone> <DueDate>2002-11-23T00:00:00</DueDate> <Date>2003-01-02T01:02:00</Date> <Date>2003-01-02T03:04:05</Date> <LongDateInEnglish>2005-05-26T15:50:11+05:30</LongDateInEnglish> <LongDateInGerman>2005-05-26T15:43:10+05:30</LongDateInGerman> <InvalidDate>2008-08-02T00:00:00</InvalidDate> <MyFormatDate>16-11-2002</ MyFormatDate > </dateformat>
Oracle JCAアダプタは、変換中の検証を実装するように構成する必要があります。検証により、Oracle JCAアダプタにより変換中に無効なメッセージがパブリッシュされないことを保証できます。
次のタイプの検証の一方または両方を実装できます。
ペイロード検証では、Oracle JCAアダプタにより処理される入力と出力のXMLメッセージを検証する必要があります。ペイロード検証は、次のいずれかのレベルで設定できます。
NXSDレイヤー(nxsd:validateのトップレベルのフラグを使用)またはサービス・エンジン・レイヤーのいずれかで検証を実行できます。サービス・エンジン・レイヤー検証の詳細は、『Oracle® Fusion Middleware Oracle SOA SuiteおよびOracle Business Process Management Suiteの管理』のBPELプロセス・サービス・エンジン・プロパティの構成に関する項を参照してください。
トップレベル検証
トップレベル検証では、DOMResult (Document Object Model形式の結果)がXMLスキーマと対照して検証されます。この形式の検証は、インバウンド・ペイロードとアウトバウンド・ペイロードの両方について実装されます。また、この形式の検証では、無効なレコードのパブリッシュを制御してXML検証エラーに関する情報を提供できます。ただし、変換コンテキストは提供されません。たとえば、ネイティブ・ストリーム内でエラーが発生した行と列の情報は、トップレベル検証では提供されません。
XMLメッセージのトップレベル検証を実装するには、次のようにします。
メッセージのnxsdネームスペースを次のように設定する必要があります。
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
検証フラグを次のようにtrueに設定する必要があります。
nxsd:validation="true"
次に例を示します。
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd" targetNamespace="http://xmlns.oracle.com/pcbpel/nxsd/smoketest" elementFormDefault="qualified" attributeFormDefault="unqualified" nxsd:stream="chars" nxsd:version="NXSD" nxsd:validation="true" >
フィールドレベル検証
フィールドレベル検証では、個々のフィールドがXMLスキーマと対照して検証されます。この形式の検証はインバウンド・ペイロードについてのみ実装され、アウトバウンド・ペイロードについては実装されません。
XMLメッセージがXMLスキーマに準拠していない場合は、エラーが発生した正確な行と文字に関する情報が表示されます。
XMLメッセージのフィールドレベル検証を実装するには、次のようにします。
メッセージのnxsdネームスペースを次のように設定する必要があります。
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
検証フラグを次のようにtrueに設定する必要があります。
nxsd:fieldValidation="true"
次に例を示します。
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd" targetNamespace="http://xmlns.oracle.com/pcbpel/nxsd/smoketest" elementFormDefault="qualified" attributeFormDefault="unqualified" nxsd:stream="chars" nxsd:version="NXSD" nxsd:fieldValidation="true" >
スキーマ検証では、Oracle JCAアダプタによる変換対象のネイティブまたはXMLデータ・フォーマットに対して定義したスキーマ(ネイティブ・スキーマまたはXMLスキーマ)を検証する必要があります。
スキーマ検証を有効化するには、次のようにします。
メッセージのnxsdネームスペースを次のように設定する必要があります。
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
nxsd検証フラグを次のようにtrueに設定する必要があります。
nxsd:validateNxsd="true"
次に例を示します。
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd" targetNamespace="http://xmlns.oracle.com/pcbpel/nxsd/smoketest" elementFormDefault="qualified" attributeFormDefault="unqualified" nxsd:stream="chars" nxsd:version="NXSD" nxsd: validateNxsd ="true" >
注意:
nxsd:validateNxsd="true"検証フラグは、ペイロード・レベルの検証に影響しません。
バイト順マーク(BOM)は、バイト・シーケンスのエンコーディングを記述する特殊なU+FEFF Unicode文字です。ネイティブ・フォーマット・トランスレータは、ネイティブ入力データのキャラクタ・エンコーディングの判別にBOMを使用するように構成できます。デフォルトでは、BOMは使用されません。入力データにBOMが使用される場合は、ネイティブ・スキーマ内でnxsd:parseBom属性をtrueに設定します。このように設定しなければ、トランスレータでは解析エラーがスローされます。
サンプルのnxsdファイルを次に示します。
<?xml version= '1.0' encoding= 'UTF-8' ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
xmlns:tns="http://TargetNamespace.com/InboundService"
targetNamespace="http://TargetNamespace.com/InboundService"
elementFormDefault="qualified" attributeFormDefault="unqualified"
nxsd:parseBom="true" nxsd:version="NXSD" nxsd:stream="chars"
nxsd:encoding="UTF8">
<xsd:element name="Root-Element">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="mydata" minOccurs="1" maxOccurs="unbounded"
nxsd:style="array"
nxsd:cellSeparatedBy="${eol}">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="C1" type="xsd:string"
nxsd:style="fixedLength"
nxsd:length="3"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
ネイティブ・フォーマット・ビルダーは、文字でインバウンドの固定長ネイティブ・データを処理します。トランスレータは、内部で文字データを使用します。12cのマルチバイト・ストリーミングのサポートにより、文字ではなくバイトでフィールドの長さを指定できます。これにより、インバウンドOracleトランスレータは、バイトとしてデータを読取り、使用されるエンコーディングに基づいて文字に変換できます。同様に、アウトバウンド・トランスレータはXMLデータを(文字ではなく)バイトに変換し、出力ストリームに書き込みます。
しかし、バイトとしてフィールド長を指定したり、バイトによる長さの指定が必要な固定長データを処理することが必要な場合もあります。固定長バイナリ・データでは、文字の長さを指定しても意味がないため、バイトでの指定はとても役に立ちます。
これは、シングルバイト・キャラクタ・セットでは問題になりませんが、バイト単位の長さは文字単位の長さとは等しくないため、マルチバイト・キャラクタ・セットでは問題になります。
この問題を解決してバイトでフィールド長を指定できるようにするために、NXSDトランスレータはバイトでのフィールド長の指定をサポートしています。特に、長さの単位は、ByteまたはCharのいずれかで指定できます。デフォルト値はCharです。この単位の長さを指定するには、次の規則を使用します。
nxsd:lengthUnits="Byte|Char"
Byteではフィールド長がバイトによって変換されるように指定され、Charではフィールド長が文字によって指定されることが示されています。
インバウンドとアウトバウンドの両方のマルチバイト変換に指定するファイルは、手動で変更する必要があります。ネイティブ・フォーマット・ビルダーのユーザー・インタフェースからは実行できません。
インバウンド・データをパディング・データとして指定することもできます。これを行うと、トランスレータによってパディング・データの発生がすべて取り除かれます。
この機能を使用するには、取り除かれるパディング・バイト・データの書式をトランスレータで把握できるようにする必要があります。そのためには、次の規則を使用します。
nxsd:paddedDataType="decimal|binary|octal|hexbinary|string" nxsd:paddedBy="XYZ"
次の表に、入力として指定できるパディング・データ型の書式の説明を示します。
| 書式 | 説明 |
|---|---|
10進 |
パディング・データを10進数の書式で指定します。パディングされるバイトに対応する10進数の値を指定する必要があります。 各10進数は、nnnの書式で表します(例: 32は032と表します)。複数の数字を指定する場合は、各数字を同じ書式にする必要があります(例: 001002123は3バイト(1、2および123)を意味します)。
|
バイナリ |
パディング・データを2進数の書式で指定します。パディングされるバイトに対応する2進数の値を指定する必要があります。パディング・データを1バイトを超えて指定する場合は、各バイトに対応する長さを8にする必要があります。次に例を示します。 nxsd:paddedDataType="binary" nxsd:padStyle="head" nxsd:paddedBy='0010000000100000'/ |
8進 |
パディング・データを8進数の書式で指定します。パディングされるバイトに対応する8進数の値を指定する必要があります。パディング・データを1バイトを超えて指定する場合は、各バイトに対応する長さを3にする必要があります。例: nxsd:paddedDataType="octal" nxsd:padStyle="head" nxsd:paddedBy='040040' |
16進 |
パディング・データを16進数の書式で指定します。パディングされるバイトに対応する16進数の値を指定する必要があります。パディング・データを1バイトを超えて指定する場合は、各バイトに対応する長さを2にする必要があります。例: nxsd:paddedDataType="hexBinary" nxsd:padStyle="head" nxsd:paddedBy='2020' |
string |
パディング・データを文字列の書式で指定します。トランスレータは、スキーマ・レベルで指定されたエンコーディング(nxsd:encoding)を使用します。例: nxsd:paddedDataType="string" nxsd:padStyle="head"nxsd:paddedBy=' |
注意:
paddedDataType="string"の場合のみ、パディングでSJIS文字を使用できることに注意してください。
受信データに追加される可能性がある接頭辞および接尾辞は、XMLにパブリッシュされる前に指定することもできます。これを行うには、次の規則を使用します。
nxsd:prefixWith="XXXX" nxsd:suffixWith="YYYY"
注意:
FixedLengthスタイルのバイト・モードでデータの読取り/書込みをする間は、base64BinaryデータおよびhexBinaryデータを使用した接頭辞と接尾辞の指定がトランスレータではサポートされません。
トランスレータの動作は、XMLにパブリッシュされるデータのタイプに依存します。たとえば、次のようにタイプを指定できます。
type="xsd:string|xsd:hexBinary|xsd:base64Binary"
データ・タイプがstringに指定されている場合は、入力ストリームに対して指定されたバイト数がトランスレータによって読み取られます。
ただし、入力ストリームに十分なデータが含まれていない場合は、トランスレータによって例外がスローされます。
指定されたバイト数がトランスレータによって読み取られると、その読み取ったバイトからパディング・データがすべて取り除かれます。パディング・データを削除した後に、トランスレータは残りのバイトを文字に変換します。
残りのバイトが文字境界に一致しないか、または残りのバイトがなんらかの理由で文字に変換できない場合は、トランスレータにより例外がスローされます。
データを文字に変換することに成功した場合、それらの文字はXMLにパブリッシュされます。
指定するデータ・タイプがhexBinaryまたはbase64Binaryの場合は、パディング・データの削除後に、トランスレータによって残りのバイトが指定されたデータ・タイプに変換され、さらにXMLにパブリッシュされます。
アウトバウンド変換では、バイトでフィールド長を指定できます。トランスレータにより、XML内で指定されたデータに対応するバイトが生成されます。
データがバイトに変換されると、トランスレータではまず接頭辞または接尾辞(存在する場合)が削除されます。
文字列タイプ(スキーマでxsd:hexBinaryまたはxsd:base64Binaryとして定義されていない要素)では、パディングおよび書出しのために値をバイトに変換する前に接頭辞と接尾辞が削除されます。
バイナリ・タイプでは、接頭辞と接尾辞は前述のとおり使用できません。
トランスレータは、スキーマで指定された長さに従って生成されたバイト数をチェックします。生成されたバイト数がスキーマで指定されたものより大きい場合は、トランスレータによって例外がスローされます。
生成されたバイトが長さで指定されたものより小さい場合は、トランスレータにより、生成されたバイトの開始位置または終了位置にpaddedByデータがスキーマの指定に従って追加されます。
次の例は、変換を表すXSD、XMLおよびテキスト・ファイルを示しています。
次の例は、Base 64バイナリ・パディング・データの変換を示しています。XSDで、トランスレータはnxsd:paddedDataType=を使用して文字列を削除するよう指示されます
<?xml version="1.0" encoding="SJIS"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
targetNamespace="http://xmlns.oracle.com/test"
xmlns:tns="http://xmlns.oracle.com/test"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:stream="bytes" nxsd:version="NXSD"
nxsd:encoding="SJIS" >
<xsd:element name="root">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="field1" type="xsd:base64Binary" nxsd:style="fixedLength" nxsd:length="14"
nxsd:lengthUnit="byte" nxsd:paddedDataType="string"
nxsd:padStyle="head" nxsd:paddedBy="‚Ì"/>
<xsd:element name="field2" type="xsd:base64Binary"
nxsd:style="fixedLength" nxsd:length="13"
nxsd:lengthUnit="byte"
nxsd:paddedDataType="string"
nxsd:padStyle="tail"
nxsd:paddedBy="‚Ì"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
XMLは次のとおりです
<root xmlns="http://xmlns.oracle.com/test"> <field1>g32Di4Ngg2+DQ4Nn</field1> <field2>IILMg1SDfIFbg2c=</field2> </root>
次の例は、複数フィールドのバイナリ・データの変換を示しています。
XSDは次のとおりです。フィールド長を示すnxsd:lengthUnits="Byte"はバイトで変換されます。
<?xml version="1.0" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
targetNamespace="http://style.onron.com/pcbpel/demo"
xmlns:tns="http://style.onron.com/pcbpel/demo"
elementFormDefault="qualified"
attributeFormDefault="unqualified" nxsd:stream="bytes" nxsd:version="NXSD"
nxsd:encoding="SJIS"
>
<xsd:element name="Root-Element">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="field1" type="xsd:base64Binary" nxsd:style="fixedLength" nxsd:length="10"
nxsd:lengthUnit="Byte"/>
<xsd:element name="field2"
type="xsd:base64Binary" nxsd:style="fixedLength"
nxsd:length="10"
nxsd:lengthUnit="Byte"/>
<xsd:element name="field3" type="xsd:hexBinary"
nxsd:style="fixedLength" nxsd:length="20"
nxsd:lengthUnit="Byte"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
XMLは次のとおりです。
<Root-Element xmlns="http://style.onron.com/pcbpel/demo">
<field1>gqCCooKkICAgIA==</field1>
<field2>gqmCq4KtICAgIA==</field2>
<field3>82BD82BF82C282C482C620202020202020202020
</field3>
</Root-Element>
次の例は、バイトでのシフトJISエンコーディングを示しています。
XSDは次のとおりです。
<?xml version="1.0" encoding="SJIS"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/
pcbpel/nxsd"
targetNamespace="http://xmlns.oracle.com/
test"
xmlns:tns="http://xmlns.oracle.com/test"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:stream="bytes"
nxsd:version="NXSD"
nxsd:encoding="SJIS" >
<xsd:element name="root">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="field1"
type="xsd:hexBinary"
nxsd:style="fixedLength"
nxsd:length="14" nxsd:lengthUnit="byte"
nxsd:paddedDataType="string"
nxsd:padStyle="head"
nxsd:paddedBy="‚Ì"/>
<xsd:element name="field2"
type="xsd:hexBinary"
nxsd:style="fixedLength"
nxsd:length="13"
nxsd:lengthUnit="byte"
nxsd:paddedDataType="string"
nxsd:padStyle="tail" nxsd:paddedBy="‚Ì"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
対応するXMLは次のとおりです。
<root xmlns="http://xmlns.oracle.com/test"> <field1>837D838B8360836F83438367</field1> <field2>2082CC8354837C815B8367</field2> </root>
IdentifierLengthコンストラクトは実際のデータの長さが保存される文字数およびバイト数を示し、lengthUnitによりバイトでフィールド長を指定できます。
<?xml version="1.0" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
targetNamespace="http://style.onron.com/pcbpel/demo"
xmlns:tns="http://style.onron.com/pcbpel/demo"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:stream="bytes" nxsd:version="NXSD"
nxsd:encoding="SJIS"
>
<xsd:element name="Root-Element">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="field1" type="xsd:string"
nxsd:style="fixedLength"
nxsd:identifierLength="2"
nxsd:lengthUnit="Byte"/>
<xsd:element name="field3" type="xsd:string"
nxsd:style="fixedLength"
nxsd:identifierLength="2"
nxsd:lengthUnit="Byte"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
次の例は類似したIdentifierlength文を示していますが、タイプがbase64Binaryである部分が異なります。
XSDは次のとおりです。
<?xml version="1.0" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
targetNamespace="http://style.onron.com/pcbpel/demo"
xmlns:tns="http://style.onron.com/pcbpel/demo"
elementFormDefault="qualified"
attributeFormDefault="unqualified" nxsd:stream="bytes" nxsd:version="NXSD"
nxsd:encoding="SJIS"
>
<xsd:element name="Root-Element">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="field1" type="xsd:base64Binary" nxsd:style="fixedLength" nxsd:identifierLength="2"
nxsd:lengthUnit="Byte"/>
<xsd:element name="field3" type="xsd:hexBinary"
nxsd:style="fixedLength"
nxsd:identifierLength="2" nxsd:lengthUnit="Byte"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
XMLは次のとおりです。
<Root-Element xmlns="http://style.onron.com/pcbpel/demo"> <field1>gqCCooKkICAgIA==</field1> <field3>82BD82BF82C282C482C620202020202020202020</field3> </Root-Element>
次に類似した識別子の例を示しますが、パディング・データ(32文字にパディング)を使用し、SJISエンコーディングに変換する部分が異なります。
XSDは次のとおりです。
<?xml version="1.0" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
targetNamespace="http://style.onron.com/pcbpel/demo"
xmlns:tns="http://style.onron.com/pcbpel/demo"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:stream="bytes" nxsd:version="NXSD"
nxsd:encoding="SJIS"
>
<xsd:element name="Root-Element">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="field1" type="xsd:string"
nxsd:style="fixedLength" nxsd:identifierLength="2" nxsd:lengthUnit="Byte" nxsd:padStyle="head" nxsd:paddedBy='32'/>
<xsd:element name="field3" type="xsd:string"
nxsd:style="fixedLength"
nxsd:identifierLength="2"
nxsd:lengthUnit="Byte"
nxsd:padStyle="tail"
nxsd:paddedBy='32'/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
もう1つの識別子の例は、パディングされるバイナリ・データを示しています。
この例のXSDは次のとおりです。
<?xml version="1.0" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
targetNamespace="http://style.onron.com/pcbpel/demo"
xmlns:tns="http://style.onron.com/pcbpel/demo"
elementFormDefault="qualified"
attributeFormDefault="unqualified" nxsd:stream="bytes" nxsd:version="NXSD"
nxsd:encoding="SJIS"
>
<xsd:element name="Root-Element">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="field1" type="xsd:base64Binary" nxsd:style="fixedLength" nxsd:identifierLength="2"
nxsd:lengthUnit="Byte" nxsd:padStyle="head"
nxsd:paddedBy='32'/>
<xsd:element name="field3" type="xsd:hexBinary"
nxsd:style="fixedLength" nxsd:identifierLength="2" nxsd:lengthUnit="Byte" nxsd:padStyle="tail"
nxsd:paddedBy='32'/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
XMLは次のとおりです。
<Root-Element xmlns="http://style.onron.com/pcbpel/demo"> <field1>gqmCq4KC</field1> <field3>82BD82BF82C282C482C6</field3> </Root-Element>
マルチバイト・バイナリのパディングのXSDは次のとおりです。
<?xml version="1.0" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
targetNamespace="http://style.onron.com/pcbpel/demo"
xmlns:tns="http://style.onron.com/pcbpel/demo"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:stream="bytes"
nxsd:version="NXSD"
nxsd:encoding="SJIS"
nxsd:validateNxsd="true">
<xsd:element name="Root-Element">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="field1" type="xsd:base64Binary" nxsd:style="fixedLength" nxsd:length="10" nxsd:lengthUnit="Byte" nxsd:paddedDataType="binary" nxsd:padStyle="head" nxsd:paddedBy='0010000000100000'/>
<xsd:element name="field2" type="xsd:hexBinary"
nxsd:style="fixedLength" nxsd:length="20"
nxsd:lengthUnit="Byte" nxsd:padStyle="tail"
nxsd:paddedDataType="binary"
nxsd:paddedBy='0010000000100000'/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
XMLは次のとおりです。
<Root-Element xmlns="http://style.onron.com/pcbpel/demo"> <field1>gqmCq4Kt</field1> <field2>82BD82BF82C282C482C6</field2> </Root-Element>
マルチバイトの10進数のパディングのXMLは次のとおりです。
<?xml version="1.0" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
targetNamespace="http://style.onron.com/pcbpel/demo"
xmlns:tns="http://style.onron.com/pcbpel/demo"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:stream="bytes"
nxsd:version="NXSD"
nxsd:encoding="SJIS">
<xsd:element name="Root-Element">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="field1" type="xsd:base64Binary" nxsd:style="fixedLength" nxsd:length="10"
nxsd:lengthUnit="Byte"
nxsd:paddedDataType="decimal"
nxsd:padStyle="head"
nxsd:paddedBy='032032'/>
<xsd:element name="field2" type="xsd:hexBinary"
nxsd:style="fixedLength" nxsd:length="20"
nxsd:lengthUnit="Byte" nxsd:padStyle="tail"
nxsd:paddedDataType="decimal"
nxsd:paddedBy='032032'/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
トランスレータは、入力ストリームからバイト(SHIFT_OUT、SHIFT_IN)をエスケープするためのサポートも提供しています。
このサポートは、特にSJISエンコーディングをサポートするために提供されており、このエンコーディングでは、混在2バイト・キャラクタ・セット・モードで、モードの変更(1バイトから2バイト)を示すために、SHIFT_OUTバイトおよびSHIFT_INバイトがデータに挿入されます。
トランスレータでSOSIサポートを使用するには、次の規則を使用します。
nxsd:escapeBytes="sosi"
paddedDataType="string"の場合のみ、パディングでSJIS文字を使用できることに注意してください。
トランスレータXPath関数では、データをネイティブ・フォーマット(CSV、固定長、タブ区切り、COBOLコピーブックなどのフォーマット)からXMLフォーマットに、およびXMLフォーマットからネイティブ・フォーマットに変換できます。トランスレータXPath関数には、ストリーミングと非ストリーミングの2タイプがあります。
違いは、ストリーミング・トランスレータXPath関数はバッチ処理によるトランスフォーメーション・アプローチを実行するのに対して、非ストリーミングXPath関数はこのアプローチを実行しないことです。バッチ処理によるトランスフォーメーション・アプローチでは、数GB程度のファイルをメモリー問題が発生することなく処理できます。
この項には次のトピックが含まれます:
この項では、トランスレータXPath関数の使用について理解しておく必要のある用語を説明します。
添付要素
他の場所にあり"href"属性で参照される実際のコンテンツを、添付要素と呼ぶことがあります。実際のコンテンツは、ファイルシステムやデータベース表などに存在します。
添付は通常、次のスキーマ・コンストラクトを使用して表現されます。
<element name="hrefelement">
<complexType>
<attribute name="href" type="string"/>
</complexType>
</element>
"href"属性には、参照されるデータの実際の場所を指定します。ファイルシステム内のファイルへのパスや、データベース・エンティティへのポインタ(主キー)を指定できます。
スケーラブルなDOM
スケーラブルなDOM (SDOM)は、Oracle XML Developer Kit (Oracle XDK)に含まれていて、DOMがスケーラブルかつプラガブルにサポートされます。このため、メモリーの不足およびスケーラビリティの制限という問題が解消され、DOM構成の制御が可能になります。
Oracle XDKは、遅延実体化メカニズムを使用して、アクセスされるノードを作成し、未使用のノードをメモリーから解放するだけです。スケーラビリティが向上するため、非常に大きなXML文書も処理可能です。
ファイルの読取りおよび書込み中にトランスレータが必要になる場合があります。この項では、次のトランスレータXPath関数について説明します。
doTranslateFromNative XPath関数は、入力データをXMLに変換します。入力データとしては、文字列、添付要素またはbase64Binary要素を使用できます。
ora:dotranslateFromNative('input','nxsdTemplate','nxsdRoot','targetType','attachment element?')
次の表では、前述の構文で使用されているこの関数のパラメータについて説明します。
| パラメータ | 説明 |
|---|---|
|
XPath関数の入力データ。データとしては、変換する必要がある文字列データ、Oracleファイル/FTPアダプタの添付、外部ファイル・パスを参照する添付、またはbase64Binary要素を使用できます。 |
nxsdTemplate |
入力データからXMLフォーマットへの変換に使用するNXSDスキーマ。 |
nxsdRoot |
NXSDスキーマ内のルート要素。 |
targetType |
このパラメータは、XPath関数がネイティブ・データをXMLに変換する方法を指定します。
|
attachmentElement |
このパラメータはオプションです。これは、返されるXMLファイルの添付です。 |
例 - XPath関数の構成: 入力データが文字列タイプで、XML DOMに変換する必要がある場合
<variables>
<variable…/>
<variable name="csv_data" type="xsd:string"/>
</variables>
<assign name="assignCSVData">
<copy>
<from expression="'this, is, csv, data…'"/>
<to variable="csv_data"/>
</copy>
</assign>
<assign name="doTranslateFromNativeCall">
<copy>
<from expression="ora: doTranslateFromNative (bpws:getVariableData('csv_data'), 'xsd/address-csv.xsd', 'Root-Element','DOM')"/>
<to variable="returnVariable" query="/ns1:Root-Element"/>
</copy>
</assign>
この例の説明は、次のとおりです。
csv_dataは、XMLに変換するCSVデータを含んでいるBPEL変数です。
xsd/address-csv.xsdは、プロジェクト内のNXSDスキーマへの相対パスです。
Root-Elementは、NXSDスキーマ内のルート要素です(オプション)。
returnVariableは、DOMとして返されるXMLデータです。
例 - 入力データが添付で、DOMに変換する必要がある場合
attachmentElementをBPELプロセスのスキーマに次のように定義します。
<schema targerNamespace="…">
<element name="attachmentElement">
<complexType>
<attribute name="href" type="string"/>
</complexType>
</element>
</schema>
タイプが添付要素の変数をBPELプロセスのスキーマに次のように作成します。
<variables>
<variable…/>
<variable name="attachmentVariable" type="client:attachmentElement"/>
</variables>
変換する必要があるソース・ファイルのパスを次のように割り当てます。
<assign name="AssignAttachmentReference">
<copy>
<from expression="'/tmp/xpath/in/address.csv'"/>
<to variable="attachmentVariable"
query="/client:attachmentElement/@href"/>
</copy>
</assign>
XPath関数を次のようにコールします。
<assign name="xlateFromNative">
<copy>
<from expression="ora:doTranslateFromNative (bpws:getVariableData('attachmentVariable'), 'xsd/address-csv.xsd', 'Root-Element', 'DOM')"/>
<to variable="returnVariable" query="/ns1:Root-Element"/>
</copy>
</assign>
この例の説明は、次のとおりです。
attachmentVariableは、ソース・ファイルのパスを参照するBPEL内の添付変数です。
xsd/address-csv.xsdは、プロジェクト内のNXSDスキーマへの相対パスです。
Root-Elementは、NXSDスキーマ内のルート要素です。
returnVariableは、DOMとして返されるXMLデータです。
例 - XPath関数の構成: 入力データがBase64でエンコードされていて、DOMに変換する必要がある場合
base64でエンコードされている要素をBPELプロセスのスキーマに次のように定義します。
<schema targerNamespace="…"> <element name="mtomElement" type="base64Binary"/> </schema>
タイプがmtom要素の変数をBPELプロセスのスキーマに次のように作成します。
<variables>
<variable…/>
<variable name="encodedData" type="client:mtomElement"/>
</variables>
変換する必要があるソース・ファイルのパスを次のように割り当てます。
<assign name="assignBase64EncodedData"> <copy> <from expression="'b3JhY2xl'"/> <to variable="encodedData" query="/client:mtomElement"/> </copy> </assign> <assign name="doTranslateFromNativeCall"> <copy> <from expression="ora: doTranslateFromNative (bpws:getVariableData('encodedData'), 'xsd/address-csv.xsd','Root-Element','DOM')"/> <to variable="returnVariable" query="/ns1:Root-Element"/> </copy> </assign>
この例の説明は、次のとおりです。
mtomElementは、XMLに変換するbase64エンコード・データを含んでいるBPEL変数です。
xsd/address-csv.xsdは、プロジェクト内のNXSDスキーマへの相対パスです。
Root-Elementは、NXSDスキーマ内のルート要素です。
returnVariableは、DOMとして返されるXMLデータです。
例 - XPath関数の構成: 入力データが文字列タイプで、ファイル・パスで参照される添付に変換する必要がある場合
attachmentElementをBPELプロセスのスキーマに次のように定義します。
<schema targerNamespace="…">
<element name="attachmentElement">
<complexType>
<attribute name="href" type="string"/>
</complexType>
</element>
</schema>
タイプが文字列の入力変数と、タイプが添付の出力変数を、BPELプロセスのスキーマに次のように作成します。
<variables>
<variable…/>
<variable name="csv_data" type="xsd:string"/>
<variable name="returnAttachmentVariable"
type="client:attachmentElement"/>
</variables>
変換する必要があるCSVデータを次のように割り当てます。
<assign name="assignCSVData">
<copy>
<from expression="'this, is, csv, data…'"/>
<to variable="csv_data"/>
</copy>
</assign>
変換したデータを格納するファイルのパスを次のように添付に移入します。
<assign name="AssignAttachmentReferenceForOutput">
<copy>
<from expression="'/tmp/xpath/output/address.xml'"/>
<to variable=" returnAttachmentVariable "
query="/client:attachmentElement/@href"/>
</copy>
</assign>
XPath関数を次のようにコールします。
<assign name="doTranslateFromNativeCall">
<copy>
<from expression="ora: doTranslateFromNative
(bpws:getVariableData('csv_ data'),'xsd/address-csv.xsd','Root-Element','ATTACHMENT', bpws:getVariableData('returnAttachmentVariable'))"/>
<to variable="returnAttachmentVariable"/>
</copy>
</assign>
この例の説明は、次のとおりです。
csv_dataは、XMLに変換するCSVデータを含んでいるBPEL文字列変数です。
xsd/address-csv.xsdは、プロジェクト内のNXSDスキーマへの相対パスです。
Root-Elementは、NXSDスキーマ内のルート要素です。
returnAttachmentVariableは、返された添付です。
注意: この例では、targetTypeはATTACHMENTに設定され、returnAttachmentVariableは変換したXMLが書き込まれるファイル・パスを指しています。
ただし、5つ目のパラメータ(bpws:getVariableData('returnAttachmentVariable'))はオプションです。このパラメータが未指定の場合、XPath関数ではデータベース・ベースの添付を作成し、これを返します。これを行うには、XPath関数を次のように構成します。
attachmentElementをBPELプロセスのスキーマに次のように定義します。
<schema targerNamespace="…">
<element name="attachmentElement">
<complexType>
<attribute name="href" type="string"/>
</complexType>
</element>
</schema>
タイプが文字列の入力変数と、タイプが添付の出力変数を、BPELプロセスのスキーマに次のように作成します。
<variables>
<variable…/>
<variable name="csv_data" type="xsd:string"/>
<variable name="returnAttachmentVariable"
type="client:attachmentElement"/>
</variables>
変換する必要があるCSVデータを次のように割り当てます。
<assign name="assignCSVData">
<copy>
<from expression="'this, is, csv, data…'"/>
<to variable="csv_data"/>
</copy>
</assign>
<assign name="doTranslateFromNativeCall">
<copy>
<from expression="ora: doTranslateFromNative (bpws:getVariableData('csv_data'),'xsd/address-csv.xsd','Root-Element','ATTACHMENT')"/>
<to variable="returnAttachmentVariable"/>
</copy>
</assign>
XPathコールが返された後、データベース・ベースの添付を表すGUIDを指すhref属性がreturnAttachmentVariable変数に移入されます。
注意: 変換中のデータが大きい場合は、XPath関数のtargetTypeパラメータとしてATTACHMENTまたはSDOMを使用する必要があります。
doTranslateToNative XPath関数は、入力DOMを文字列データまたは添付に変換します。
構文
ora:dotranslateToNative('input','nxsdTemplate','nxsdRoot','targetType','attachmentElement?')
次の表では、前述の構文で使用されているこの関数のパラメータについて説明します。
表6-8 doTranslateToNative関数のパラメータ
| パラメータ | 説明 |
|---|---|
input |
XPath関数の入力データ。データとしては、CSVなどのネイティブ・フォーマットに変換する必要があるDOMまたはSDOMデータを使用できます。 |
nxsdTemplate |
入力データからXMLフォーマットへの変換に使用するNXSDスキーマ。 |
nxsdRoot |
NXSDスキーマ内のルート要素の名前。 |
targetType |
このパラメータは、XPath関数がXMLデータをネイティブ・フォーマットに変換する方法を指定します。
|
attachmentElement |
このパラメータはオプションです。これは、変換したデータが書き込まれる添付です。 |
例 - XPath関数の構成: 入力データがXMLフォーマットで、CSV文字列フォーマットに変換する必要がある場合
<variables>
<variable…/>
<variable name="inputDOM" type="ns1:Root-Element"/>
<!- - data that must be translated into native - ->
<variable name="returned_csv_data"
type="xsd:string"/>
</variables>
<assign name="doTranslateToNativeCall">
<copy>
<from expression="ora: doTranslateToNative (bpws:getVariableData('inputDOM'),
'xsd/address-csv.xsd','Root-Element','STRING')"/>
<to variable="returned_csv_data"/>
</copy>
</assign>
この例の説明は、次のとおりです。
inputDOMは、変換したCSVを表す文字列データに変換するXMLデータを含んでいるBPEL DOM変数です。
xsd/address-csv.xsdは、プロジェクト内のNXSDスキーマへの相対パスです。
Root-Elementは、NXSDスキーマ内のルート要素です。
return_csv_dataは、変換されたCSVデータを含んでいる文字列変数です。
例 - XPath関数の構成: 入力XML DOMを、変換したCSVのターゲット・ファイルのパスを表す添付に変換する場合
attachmentElementをBPELプロセスのスキーマに次のように定義します。
<schema targerNamespace="…">
<element name="attachmentElement">
<complexType>
<attribute name="href"
type="string"/>
</complexType>
</element>
</schema>
タイプがattachmentElementの入力変数をBPELプロセスのスキーマに次のように作成します。
<variables>
<variable…/>
<variable name="inputDOM"
type="ns1:Root-Element"/>
<variable name="attachmentVariable"
type="client:attachmentElement"/>
</variables>
変換したCSVを書き込むターゲット・ファイルのパスを次のように割り当てます。
<assign name="AssignAttachmentReference">
<copy>
<from expression=
"'/tmp/xpath/out/address.csv'"/>
<to variable="attachmentVariable"
query="/client:attachmentElement/@href"/>
</copy>
</assign>
XPath関数を次のようにコールします。
<assign name="xlateToNative">
<copy>
<from expression="ora:doTranslateToNative
(bpws:getVariableData('inputDOM'),'xsd/address-csv.xsd' 'Root-Element', 'ATTACHMENT', bpws:getVariableData
(' attachmentVariable'))"/>
<to variable="attachmentVariable"/>
</copy>
</assign>
この例の説明は、次のとおりです。
inputDOMは、/tmp/xpath/out/address.csvで表されるCSV出力ファイルに変換するXMLデータを含んでいるBPEL DOM変数です。
xsd/address-csv.xsdは、プロジェクト内のNXSDスキーマへの相対パスです。
Root-Elementは、NXSDスキーマ内のルート要素です。
AttachmentElementは、/tmp/xpath/out/address.csvで表されるターゲット出力ファイルへのパスです。
注意: この例では、targetTypeはATTACHMENTに設定され、AttachmentVariableは変換したCSVファイルが書き込まれるファイル・パスを指しています。
ただし、5つ目のパラメータ(bpws:getVariableData('attachmentVariable'))はオプションです。このパラメータが未指定の場合、XPath関数ではデータベース・ベースの添付を作成し、これを返します。これを行うには、XPath関数を次のように構成します。
attachmentElementをBPELプロセスのスキーマに次のように定義します。
<schema targerNamespace="…">
<element name="attachmentElement">
<complexType>
<attribute name="href" type="string"/>
</complexType>
</element>
</schema>
タイプがattachmentElementの入力変数をBPELプロセスのスキーマに次のように作成します。
<variables>
<variable…/>
<variable name="inputDOM" type="ns1:Root-Element"/>
<variable name="attachmentVariable"
type="client:attachmentElement"/>
</variables>
XPath関数を次のようにコールします。
<assign name="xlateToNative">
<copy>
<from expression="ora:doTranslateToNative
(bpws:getVariableData('inputDOM'),
'xsd/address-csv.xsd', 'Root-Element',
'ATTACHMENT')"/>
<to variable="attachmentVariable"/>
</copy>
</assign>
XPathコールが返された後、データベース・ベースの添付を表すGUIDを指すhref属性がattachmentVariableに移入されます。
XPath関数は、バッチ処理によるトランスフォーメーション・アプローチを実行します。このアプローチでは、数GB程度のファイルをメモリー問題が発生することなく処理できます。トランスフォーメーション・エンジンはトランスフォーメーションの結果をそのメモリーに格納しないため、任意の大きさのペイロードを処理できます。トランスフォーメーション・エンジンは、大きなファイルの要素のバッチ処理後に、メモリーをフラッシュします。デフォルトのバッチ・サイズは要素数10000で、トランスフォーメーション・エンジンはこの数の要素を処理するとメモリーをフラッシュします。このパラメータはオプションであり、内部で使用されます。
注意:
バッチ処理によるトランスフォーメーション・アプローチは、繰返し構造のXMLドキュメントに対してのみサポートされています。
構文
ora:doStreamingTranslate('input','streamingXpathContext','targetType','attachmentElement?')
表6-9に、前述の構文で使用されているこの関数のパラメータを示します。
表6-9 doStreamingTranslateのパラメータ
| パラメータ | 説明 |
|---|---|
input |
XPath関数の入力データ。データとしては、SDOMまたは添付要素を使用できます。 |
|
XPathコンテキストを表すDOM。 |
targetType |
このパラメータは、XPath関数が入力データを添付に変換する方法を指定します。 |
attachmentElement |
このパラメータはオプションです。これは、データがストリームされる添付です。 |
sourceDocumentType |
ソース要素が |
streamingXPathContextパラメータは、ストリーミング・トランスフォーメーションのコンテキストを指定し、次のスキーマ要素に一致する必要があります。
例 - streamingXPathContextが一致する必要のあるスキーマ要素
<schema targetNamespace="…">
<element name="streamingcontext">
<complexType>
<sequence>
<element name="sourceSchema"
type="string"/>
<element name="sourceRootElement"
type="string"/>
<element name="sourceType"
type="string"/>
<element name="sourceDocumentType"
type="string"/>
<element name="xsl"
type="string"/>
<element name="targetSchema"
type="string"/>
<element name="targetRootElement"
type="string"/>
<element name="targetType" type="string"/>
<element name="batchSize" type="string"/>
</sequence>
</complexType>
</element>
</schema>
表6-10 streamingXPathContextパス・パラメータ
| パラメータ | 説明 |
|---|---|
sourceSchema |
ネイティブ・データからXMLへの変換に使用するソースNXSDスキーマ。 |
sourceRootElement |
ネイティブ・データからXMLへの変換に使用するソースNXSDスキーマ。 |
sourceType |
入力データに応じて |
xsl |
XSLの相対パス。 |
targetSchema |
XMLからネイティブ・データへの変換に使用するターゲットNXSDスキーマ。 |
targetRootElement |
ターゲットNXSDスキーマ内のルート要素の名前。 |
targetType |
出力データに応じて |
batchSize |
トランスフォーメーション・エンジンがメモリーをフラッシュするまでに処理する要素数。 |
この項では、バッチ処理によるトランスフォーメーションが持つ次の特徴を説明します。
適用性
バッチ処理によるトランスフォーメーションの適用対象は次のとおりです。
繰返し構造のドキュメント
ドキュメント全体の集計が不要なXSLT
XSLTエンジンのバッチ起動
XSLTエンジンのバッチ起動の主な手順は次のとおりです。
ソース・ドキュメントを、1つ以上のレコードを含む複数のバッチに分割します。
1度に1つのバッチについてXSLTトランスフォーメーションを実行します。
XSLT起動の結果を単一のターゲット・ドキュメントに結合します。
分割または結合の即時実行
ソース・ドキュメントの分割と分割結果のターゲット・ドキュメントへの結合は、次のように実行されます。
中間メモリーやディスク記憶域は使用しません。
SAXイベントのパイプラインまたはインターセプトが行われます。
小さくて済む、メモリーでのフットプリント
バッチ処理によるトランスフォーメーションでは、次のタスクにメモリーをあまり使用しません。
任意の大きさ(ターゲット・システムによって制約あり)のXMLドキュメントの変換
スタンドアロン・テストでは、540MBの変換は3分未満で完了
次の例では、ストリーミング・トランスフォーメーションXPath関数を使用して、FlatStructureファイル・アダプタのサンプルを実装します。このサンプルの使用例では、インバウンドのネイティブ添付をCSVフォーマットからXMLフォーマットに変換してから、生成されたXMLファイルにユーザー指定のXSLファイルを適用します。これにより、変換済XMLファイルは、添付が表す固定長コンテンツに変換されます。
例 - ストリーミング・トランスフォーメーションXPath関数の使用
attachmentElementを次のように定義します。
例 - attachmentElementの定義
<schema targerNamespace="…">
<element name="attachmentElement">
<complexType>
<attribute name="href"
type="string"/>
</complexType>
</element>
</schema>
インバウンドcsvファイルを参照する入力添付と、出力固定長ファイルを参照する出力添付に使用する、変数を作成します。ストリーミング・コンテキストに対応する変数を作成します。この変数への移入は、XPath関数をコールする前に行う必要があります。
例 - 入力添付の変数の作成
<variables>
<variable name="xlationContext"
element="client:streamingcontext"/>
<variable name="inputAttachment"
element="client:attachmentElement"/>
<variable name="returnAttachment"
element="client:attachmentElement"/>
</variables>
<!- - Assign the input and output attachments - ->
<assign name="assignValuesForAttachments">
<copy>
<from expression="'/tmp/xpath/in/address.csv' "/>
<to variable="inputAttachment"
query="/client:attachmentElement/@href"/>
</copy>
<copy>
<from expression="
'/tmp/xpath/out/address_fixedLength.txt' "/>
<to variable="returnAttachment"
query=
"/client:attachmentElement/@href"/>
</copy>
</assign>
<!- - Assign the streaming context - ->
<assign name="AssignStreamingContext">
<copy>
<from expression="'xsd/address-csv.xsd'"/>
<to variable="xlationContext"
query="/client:streamingcontext
/client:sourceSchema"/>
</copy>
<copy>
<from expression="'Root-Element'"/>
<to variable="xlationContext"
query="/client:streamingcontext/
client:sourceRootElement"/>
</copy>
<copy>
<from expression="'native'"/>
<to variable="xlationContext"
query="/client:streamingcontext/client:
sourceType"/>
</copy>
<copy>
<from expression=
"'xsd/address-fixedLength.xsd'"/>
<to variable="xlationContext"
query="/client:streamingcontext/
client:targetSchema"/>
</copy>
<copy>
<from expression="'Root-Element'"/>
<to variable="xlationContext"
query="/client:streamingcontext/client:
targetRootElement"/>
</copy>
<copy>
<from expression="'native'"/>
<to variable="xlationContext"
query="/client:streamingcontext/client:
targetType"/>
</copy>
<copy>
<from expression="'xsl/addr1Toaddr2.xsl'"/>
<to variable="xlationContext"
query="/client
:streamingcontext/client:xsl"/>
</copy>
<copy>
<from expression="'10000'"/>
<to variable="xlationContext"
query="/client:streamingcontext/client:
batchSize"/>
</copy>
</assign>
<!- - call the XPath function - ->
<assign name="executeStreamingXPath">
<copy>
<from expression=
"ora:doStreamingTranslate
(bpws:getVariableData('inputAttachment',
'/client:attachmentElement'),
bpws:getVariableData('xlationContext'),
'ATTACHMENT',
bpws:getVariableData('returnAttachment'))"/>
<to variable="returnAttachment"
query="/client:attachmentElement"/>
</copy>
</assign>
この説では、次の使用例について説明します。
注意:
現在、ネイティブ・フォーマット・ビルダーでは、複数文字のデリミタを含むデータのサンプリングはサポートされていません。この種のデータをサンプリングするには、適切なDelimited By文字列を使用してNXSDをハンド・コーディングします。
カンマ区切り値(CSV)ファイルは、一般的なXML以外のファイル構造です。
このネイティブ・ファイルのXMLスキーマを作成する際には、ネイティブ・フォーマット・ビルダー・ウィザードの「デリミタ」オプションを使用します。
nxsd:headerLines="1"スキーマ属性は、ネイティブ・データの1行目をヘッダー行として処理してスキップしてから、残りのデータに対して実際の変換を行う必要があることを意味します。nxsd:stream="chars"スキーマ属性は、データが文字として読み取られることを意味します。nxsd:stream="bytes"のようにnxsd:streamがbytesに設定されている場合は、このスキーマ属性は、ネイティブ・データがバイトとして読み取られることを意味します。対応するスカラー・データを持つName、Street、City、State、Countryの各要素の宣言では、nxsd:style="terminated"属性によって対応するデータがterminatedスタイルで保存されていることが定義されています。実際の終了文字は、コンストラクトに指定されているnxsd:terminatedBy=","属性で定義されています。terminatedスタイルの詳細は、「終了データの定義」を参照してください。
この使用例では、ネイティブ・フォーマット・ビルダーにより、名前、番地、市区町村、都道府県および国などの住所詳細を含んだデリミタ付きサンプル・ファイル・タイプが使用されます。このサンプル・ネイティブ・ファイル内の要素は、すべてカンマ(,)で区切られています。対応するNXSDを生成し、同様にテストできます。この使用例を実行する手順は、次のとおりです。
前述の例で定義された使用例は、*SVクラスの一例です。ワイルド・カードは、任意の文字または文字列に置き換えられます。たとえば、プラス(+)で区切られた値を含むネイティブ・データの場合、ワイルド・カードをプラス(+)文字で置き換えます。
このネイティブ・ファイルのXMLスキーマを作成する際には、ネイティブ・フォーマット・ビルダー・ウィザードの「デリミタ」タイプ・オプションを使用します。
変換されるネイティブ・データ・フォーマット
次のようなネイティブ・データ・フォーマットがあります。
a+b+c+d+e f+g+h+i+j
ネイティブ・スキーマ
nxsd:terminatedBy=","のかわりにterminated byフォーマットをnxsd:terminatedBy="+"として定義することを除き、対応するネイティブ・スキーマ定義は前の使用例と似ています。terminatedスタイルの詳細は、「終了データの定義」を参照してください。
この例では、使用されるネイティブ・データはCSVの場合と同じですが、データのタイプはCSVではなく固定長です。
このネイティブ・ファイルのXMLスキーマを作成するには、ネイティブ・フォーマット・ビルダー・ウィザードの「固定長」オプションを使用します。
この使用例では、ネイティブ・フォーマット・ビルダーにより、名前、番地、市区町村、都道府県および国などの住所詳細を含んだaddressという固定長ファイル・タイプが使用されます。このaddressネイティブ・ファイル内の要素は、すべて固定長です。対応するNXSDを生成し、同様にテストできます。この使用例を実行する手順は、次のとおりです。
請求書のファイル構造は、前述の使用例で説明したCSV、*SVおよび固定長のファイルの構造よりも複雑です。通常、請求書には購入者の情報、販売者の情報および明細項目が含まれます。これらの各要素には、複合タイプを使用できます。たとえば、購入者要素をpartner-typeとして定義し、partner-typeをid、nameおよびaddressという3つの要素で構成できます。
このネイティブ・ファイルのXMLスキーマを作成する際には、ネイティブ・フォーマット・ビルダー・ウィザードの「複合タイプ」オプションを使用します。
この使用例では、ネイティブ・フォーマット・ビルダーにより、buyer、seller、itemsなどの複数のレコードを含んだinvoiceという複合ファイル・タイプのinvoice.txtが使用されます。この使用例を使用すると、NXSDを生成してテストすることもできます。この使用例を実行する手順は、次のとおりです。
サンプル・テキスト・ファイルinvoice.txt内のデータは、次のとおりです。
6335722^Company OnêFirst Street 999 San Jose 95129USCA650-801-6250 ^OraclêBridge Parkway 1600 Redwood Shores 94065USCA650-506-7000 001|BPEL Process Manager Enterprise Edition|20000,2,+40000+ 002|BPEL Process Manager Standard Edition|10000,5,+50000+ 003|BPEL Process Manager Developer Edition|1000,20,+20000+#110000
図6-4に示すように、アダプタ構成ウィザードを起動し、「メッセージ」ページにナビゲートして「ネイティブ・フォーマットのスキーマの定義」をクリックします。図6-5に示すように、「ネイティブ・フォーマット・ビルダー: ようこそ」ページが表示されます。
「Next」をクリックします。図6-26に示すように、「タイプの選択」ページが表示されます。
「複合タイプ(フィールドそのものがレコードで複数のデリミタ・タイプを持つ可能性があるレコードが含まれています)」を選択します。
「Next」をクリックします。ネイティブ・フォーマット・ビルダーの「ファイルの説明」ページが表示されます。
図6-27に示すように、「参照」をクリックしてinvoice.txtファイルを選択し、「ルート要素」フィールドにInvoiceと入力します。
「Next」をクリックします。図6-28に示すように、ネイティブ・フォーマット・ビルダーの「設計スキーマ」が表示されます。
partner-type複合タイプの作成
invoice.txtサンプルを使用して作成できるスキーマ構造は、次のとおりです。
Invoice
Buyer => partner-type
Seller => partner-type
Items => item-type
Invoice-total => double
ネイティブ・データの1行目は購入者の詳細で構成され、販売者の詳細、明細項目および明細項目の合計が続きます。購入者要素と販売者要素の両方が、次のように同じ複雑な構造を持っています。
最初の7文字はUIDです。
これには、「^」で囲まれた購入者/販売者の名前が続きます。
この後には、行末まで住所が続きます。
これをネイティブ・フォーマット・ビルダーで作成するには、次の手順を実行します。
「複合タイプの追加」アイコンをクリックします。図6-29に示すように、「スキーマ・ツリー」でInvoiceの下に複合タイプ<new_complex_type>が作成されます。
「サンプル・ファイル」セクションの右ペインからサンプル・テキストの1行目を選択し、「<new_complex_type>」ノードにドラッグ・アンド・ドロップします。「複合タイプ詳細」ダイアログが表示されます。
図6-30に示すように、「複合タイプ名」フィールドにpartner-typeと入力します。
図6-30 「ネイティブ・フォーマット・ビルダー・ウィザード - 設計スキーマ」ページ: 「複合タイプ詳細」ダイアログ

必要な位置でルーラーをクリックしてサンプル・テキスト領域のフィールドをマーク付けし、「フィールドの生成」ボタンをクリックします。システムが定義済フィールドのデータのスタイルを解釈します。
注意:
「固定長」または「混在」デリミタ・タイプ・オプションを選択した場合は、ルーラー・ベースのテキスト領域が表示されます。ルーラーを使用して、サンプル・テキスト内のフィールドを識別する必要があります。デリミタ付きデータの場合は、「デリミタ」フィールドで該当するデリミタを選択または入力します。
図6-31に示すように、「名前」フィールドにid、nameおよびaddressと入力します。
各フィールドの横にある鉛筆アイコンをクリックし、フィールド・プロパティを編集可能な対応する「フィールド詳細の編集」ダイアログを表示します。たとえば、「名前」フィールドの横にある鉛筆アイコンをクリックします。図6-32に示すように、「フィールド詳細の編集」ダイアログが表示されます。
図6-32に示すように、次のフィールド・プロパティを編集します。
タイプ: サンプル・テキストのデータ型。「タイプ」リストで「String」を選択します。
スタイル: 複合タイプ要素のスタイルを表します。次の4つのオプションから選択できます。
固定長
surrounded
terminated
左囲み/右囲み
この例では、surroundedを選択します。
囲み: このオプションが表示されるのは、「スタイル」オプションでsurroundedを選択した場合です。この例では、「囲み」フィールドにカレット(^)を入力します。
このパネルに表示されるフィールド・プロパティは、スキーマに使用されているNXSD属性に対応しています。
「OK」をクリックします。選択したフィールド・プロパティを含んだ「複合タイプ詳細」ダイアログが表示されます。
「名前」フィールドのidおよびaddressのフィールド・プロパティを確認または編集します。
「複合タイプ詳細」ダイアログで「OK」をクリックします。図6-33に示すように、ネイティブ・フォーマット・ビルダーの「設計スキーマ」ページが表示されます。
図6-33 「ネイティブ・フォーマット・ビルダー・ウィザード - 設計スキーマ」ページ: partner-type複合タイプ

address-type複合タイプの作成
address要素を、さらに固定長の番地、市区町村などのフィールドを含んだ別のcomplex-typeとして定義できます。
これを行うには、次の手順を実行します。
「スキーマ・ツリー」で別の<noncompliant>ノードを作成します。「partner-type複合タイプの作成」のステップ1を参照してください。
サンプル・テキストの1行目のaddressパートを複合タイプ<noncompliant>にドラッグ・アンド・ドロップします。「複合タイプ詳細」ダイアログが表示されます。
「複合タイプ名」フィールドにaddress-typeと入力します。
ルーラーをクリックしてサンプル・テキスト領域のフィールドをマーク付けし、「フィールドの生成」ボタンをクリックします。次に、図6-34に示すように、「名前」フィールドにstreet1、street2、city、zip、country、stateおよびphoneと入力します。
図6-34 「ネイティブ・フォーマット・ビルダー・ウィザード - 設計スキーマ」ページ: 「複合タイプ詳細」ダイアログ

「OK」をクリックします。図6-35に示すように、ネイティブ・フォーマット・ビルダーの「設計スキーマ」ページが表示されます。
partner-type複合タイプのaddressフィールドへのaddress-type複合タイプの割当て
partner-type複合タイプのaddressフィールドに、address-type複合タイプを割り当てる必要があります。次のいずれかの方法で要素に複合タイプを割り当てることができます。
address-typeノードをpartner-type複合タイプのaddressフィールド・ノードにドラッグ・アンド・ドロップします。これにより、addressフィールド要素にaddress-typeが即時に割り当てられます。または
partner-type複合タイプのaddressフィールド・ノードを選択し、鉛筆アイコンをクリックします。
図6-36に示すように、「フィールド詳細の編集」ダイアログが表示されます。
「タイプ」リストで「address-type」オプションを選択し、「OK」をクリックします。図6-37に示すように、ネイティブ・フォーマット・ビルダーの「設計スキーマ」ページでaddressフィールド要素にaddress-typeオプションが割り当てられます。
buyerおよびsellerグローバル要素の作成
「Invoice」を選択し、「要素の追加」アイコンをクリックします。「スキーマ・ツリー」で、ルート要素「Invoice」の下に要素<new_element>が作成されます。
名前をbuyerに変更します。
再び「Invoice」を選択し、「要素の追加」アイコンをクリックします。「スキーマ・ツリー」で、「Invoice」の下に要素<new_element>が作成されます。
名前をsellerに変更します。
各buyerおよびsellerノード上にpartner-typeノードをドラッグ・アンド・ドロップして、これらのノードにpartner-type複合タイプを割り当てます。図6-38に示すように、「スキーマ・ツリー」が表示されます。
item-type複合タイプとitemsおよびinvoice-total要素ノードの作成
items要素はitem-typeの配列とみなすことができます。ネイティブ・ファイル内の最後の明細項目では、番号記号(#)の後に明細項目の合計が続いて終了しています。
「Invoice」を選択し、「要素の追加」アイコンをクリックします。「スキーマ・ツリー」で、「Invoice」の下に要素<new_element>が作成されます。
名前をitemsに変更します。
図6-39に示すように、item-type複合タイプを作成してフィールド・プロパティを定義します。
item-type複合タイプをitems要素にドラッグ・アンド・ドロップして、この要素にitem-typeを割り当てます。
items - item-typeを選択して鉛筆アイコンをクリックします。「要素の詳細」ダイアログが表示されます。
図6-40に示すように、「要素の詳細」ダイアログで次のプロパティを設定します。
「最大発生数」を「バインドなし」に設定します。
「配列」を選択します。「セル・セパレータ」および「配列セパレータ」が有効になります。
「セル・セパレータ」を「${eol}」に設定します。
「配列セパレータ」を「#」に設定します
注意:
要素itemsはitem-typeの配列として定義されます。
「OK」をクリックします。
invoice-total要素を作成し、サンプル・テキスト(110000)を<new_element>ノードにドラッグ・アンド・ドロップします。「要素の詳細」ダイアログが表示されます。
「要素名」フィールドにinvoice-totalと入力し、「フィールドの生成」をクリックします。図6-41に示すように、「アラート」メッセージが表示されます。
グローバル要素のサンプル・データで単一フィールドが識別されている場合、このデータのプロパティがグローバル要素自体に適用されます。
「アラート」メッセージで「OK」をクリックします。「要素の詳細」ダイアログが表示されます。
「データ型」リストで「double」を選択し、「OK」をクリックします。図6-42に示すように、ネイティブ・フォーマット・ビルダーの「設計スキーマ」ページが表示されます。
図6-42 「ネイティブ・フォーマット・ビルダー・ウィザード - 設計スキーマ」ページ: 完成したスキーマ・ツリー

「Next」をクリックします。図6-43に示すように、「生成されたネイティブ・フォーマット・スキーマ・ファイル」ページが表示され、ネイティブ・フォーマット・ファイルが表示されます。
図6-43 「ネイティブ・フォーマット・ビルダー・ウィザード - 生成されたネイティブ・フォーマット・ファイル」ページ

前述のネイティブ・データに対応するネイティブ・スキーマの定義は、次のように定義できます。
例 - ネイティブ・スキーマの定義
<schema attributeFormDefault="qualified"
elementFormDefault="qualified"
targetNamespace=
"http://xmlns.oracle.com/ias/pcbpel
/fatransschema/demo"
xmlns:tns="http://xmlns.oracle.com
/ias/pcbpel/
fatransschema/demo"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/
nxsd"
nxsd:version="NXSD" nxsd:stream="chars">
<element name="invoice" type="tns:invoiceType" />
<complexType name="invoiceType">
<sequence>
<element name="purchaser"
type="tns:partnerType" />
<element name="seller"
type="tns:partnerType" />
<element name="line-item"
type="tns:line-itemType"
maxOccurs="unbounded" nxsd:style="array"
nxsd:cellSeparatedBy="${eol}"
nxsd:arrayTerminatedBy="#"/>
<element name="total" type="double"
nxsd:style="terminated"
nxsd:terminatedBy="${eol}"/>
</sequence>
</complexType>
<complexType name="partnerType">
<sequence>
<element name="uid" type="string"
nxsd:style="fixedLength"
nxsd:length="7" nxsd:padStyle="tail"
nxsd:paddedBy=" "/>
<element name="name" type="string"
nxsd:style="surrounded"
nxsd:surroundedBy="^"/>
<element name="address"
type="tns:addressType" />
</sequence>
</complexType>
<complexType name="addressType">
<sequence>
<element name="street1"
type="string"
nxsd:style="fixedLength"
nxsd:length="15"
nxsd:padStyle="tail"
nxsd:paddedBy=" "/>
<element name="street2" type="string"
nxsd:style="fixedLength"
nxsd:length="10"
nxsd:padStyle="tail"
nxsd:paddedBy=" "/>
<element name="city" type="string"
nxsd:style="fixedLength"
nxsd:length="15" nxsd:padStyle="tail"
nxsd:paddedBy=" "/>
<element name="postal-code" type="string"
nxsd:style="fixedLength"
nxsd:length="5"
nxsd:padStyle="none"/>
<element name="country" type="string"
nxsd:style="fixedLength"
nxsd:length="2"
nxsd:padStyle="none"/>
<element name="state" type="string"
nxsd:style="fixedLength"
nxsd:length="2" nxsd:padStyle="none"/>
<element name="phone" type="string"
nxsd:style="terminated"
nxsd:terminatedBy="${eol}"/>
</sequence>
</complexType>
<complexType name="line-itemType">
<sequence>
<element name="uid" type="string"
nxsd:style="fixedLength"
nxsd:length="3" nxsd:padStyle="none"/>
<element name="description" type="string"
nxsd:style="surrounded"
nxsd:surroundedBy="|"/>
<element name="price" type="double"
nxsd:style="terminated"
nxsd:terminatedBy=","/>
<element name="quantity" type="integer"
nxsd:style="terminated"
nxsd:terminatedBy=","/>
<element name="line-total" type="double"
nxsd:style="surrounded"
nxsd:surroundedBy="+"/>
</sequence>
</complexType>
</schema>
「テスト」をクリックします。図6-44に示すように、「NXSDスキーマのテスト」ダイアログが表示されます。
「XMLの生成」アイコンをクリックします。図6-45に示すように、「NXSDスキーマのテスト」ダイアログの右ペインに「結果XML」が表示されます。
次の例に、変換済のXMLを示します。
例 - 変換済のXML
<invoice xmlns="http://xmlns.oracle.com/pcbpel/
demoSchema/invoice-nxsd">
<purchaser>
<uid>6335722</uid>
<name>Company One</name>
<address>
<street1>First Street</street1>
<street2>999</street2>
<city>San Jose</city>
<postal-code>95129</postal-code>
<country>US</country>
<state>CA</state>
<phone>650-801-6250</phone>
</address>
</purchaser>
<seller>
<uid/>
<name>Oracle</name>
<address>
<street1>Bridge Parkway</street1>
<street2>1600</street2>
<city>Redwood Shores</city>
<postal-code>94065</postal-code>
<country>US</country>
<state>CA</state>
<phone>650-506-7000</phone>
</address>
</seller>
<line-item>
<uid>001</uid>
<description>BPEL Process Manager Enterprise
Edition</description>
<price>20000</price>
<quantity>2</quantity>
<line-total>40000</line-total>
</line-item>
<line-item>
<uid>002</uid>
<description>BPEL Process Manager Standard
Edition</description>
<price>10000</price>
<quantity>5</quantity>
<line-total>50000</line-total>
</line-item>
<line-item>
<uid>003</uid>
<description>BPEL Process Manager Developer
Edition</description>
<price>1000</price>
<quantity>20</quantity>
<line-total>20000</line-total>
</line-item>
<total>110000</total>
</invoice>
「OK」をクリックします。図6-43に示すように、「生成されたネイティブ・フォーマット・ファイル」ページが表示されます。
「Next」をクリックします。図6-15に示すように、「ネイティブ・フォーマット・ビルダー: 終了」ページが表示されます。
「終了」をクリックします。図6-16に示すように、生成されたNXSDを含んだアダプタ構成ウィザードの「メッセージ」ページが表示されます。
ネイティブ・データがXMLでありそのXMLにネームスペースがない場合は、ネイティブ・フォーマット・トランスレータを使用してインバウンドXMLドキュメントにネームスペースを追加したりアウトバウンドXMLドキュメントからネームスペースを削除したりできます。
次のいずれかに該当する場合、XMLにはネームスペースがありません。
XMLに対応するXMLスキーマがあり、そのXMLスキーマにターゲット・ネームスペースが指定されていない場合。
XMLに対応するDTDがあり、それがXMLスキーマに変換されたDTDである場合。
どちらの場合も、targetNamespaceが指定されたラッパー・スキーマを作成し、そのラッパー・スキーマに実際のスキーマを含める必要があります。また、ラッパー・スキーマにはDTDに設定されたnxsd:version属性も必要です。次に例を示します。
--wrapper.xsd <?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="myNamespace" xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd" nxsd:version="DTD"> <include schemaLocation="actual.xsd"/> </schema>
注意:
実際のスキーマにelementFormDefault="qualified"が指定されていることを確認してください。
元の.xsdファイルのかわりにこのwrapper.xsdファイルを使用すると、インバウンドXMLにmyNamespaceネームスペースが追加され、アウトバウンドXMLからmyNamespaceネームスペースが削除されます。
この使用例では、ネイティブ・フォーマット・ビルダーにより、order、customer、itemsなどの複数のレコード・タイプを含んだorder.txtという複合タイプのファイルが使用されます。この使用例を使用すると、NXSDを生成してテストすることもできます。この使用例を実行する手順は、次のとおりです。
この使用例では、ネイティブ・フォーマット・ビルダーにより、異なるaddressを持つ複数のレコードを含んだaddress.txtという複合タイプのファイルが使用されます。この使用例では2つのレコード・タイプを持つスキーマを作成します。RecOneレコードはテキスト「YES」で終わるレコードのデータを取得し、RecTwoレコードはテキスト「NO」で終わるレコードのデータを取得します。
この使用例を使用すると、NXSDを生成してテストすることもできます。
この使用例を実行する手順は、次のとおりです。
この使用例では、ネイティブ・フォーマット・ビルダーにより、項目の配列を含んだarray.txtという複合タイプのファイルが使用されます。サンプル・データには、4つの名前をセミコロンで区切って末尾にピリオド1個を付けたものが含まれています。この使用例では、メンバー名がセミコロンで区切られて配列がピリオド1個で終了する配列タイプを使用したスキーマを作成します。この使用例を使用すると、NXSDを生成してテストすることもできます。
この使用例を実行する手順は、次のとおりです。
この使用例では、DTDファイルというネイティブ・データ・タイプのスキーマを定義する手順を説明します。
このネイティブ・ファイルのXMLスキーマを作成する際には、ネイティブ・フォーマット・ビルダー・ウィザードの「XSDに変換するDTD」オプションを使用します。
この使用例では、ネイティブ・フォーマット・ビルダーにより、DTDファイル・タイプ*.dtdが使用されます。対応するNXSDを生成し、同様にテストできます。この使用例を実行する手順は、次のとおりです。
この使用例は、変換用のネイティブ・スキーマ・ファイルを作成するために、Oracleファイル/FTPアダプタが(ネイティブ・フォーマット・ビルダー・ウィザードを使用して) COBOLコピーブック・フォーマットのファイルをどのように処理するかを示しています。
次のCOBOLコピーブックの例も提供されています。
COBOLコピーブックには、複数のルート・レベルを含めることができます。すべてのルート・レベルが01のレベルの場合、各グループは暗黙的に他のグループを再定義します。
この使用例では、ネイティブ・フォーマット・ビルダーにより、購入者名、住所および項目などの注文書詳細を含んだpo-ccb.cpyという固定長ファイル・タイプが使用されます。このpo-ccb.cpyネイティブ・ファイル内の要素は、すべて固定長です。サンプル・テキスト・ファイルpo-ccb.cpy内のデータは、次のとおりです。
05 PO-RECORD. 10 PO-BUYER. 15 PO-UID PIC 9(7). 15 PO-NAME PIC X(15). 15 PO-ADDRESS. 20 PO-STREET PIC X(15). 20 PO-CITY PIC X(10). 20 PO-ZIP PIC 9(5). 20 PO-STATE PIC X(2). 10 PO-ITEM. 15 POITEM OCCURS 3 TIMES. 20 PO-LINE-ITEM. 25 PO-ITEM-ID PIC 9(3). 25 PO-ITEM-NAME PIC X(40). 25 PO-ITEM-QUANTITY PIC 9(2). 25 PO-ITEM-PRICE PIC 9(5)V9(2). 10 PO-TOTALPIC 9(7)V9(2).
対応するNXSDを生成し、同様にテストできます。この使用例を実行する手順は、次のとおりです。
次のCOBOLコピーブックには、単一のルート・レベル・アイテムPO-RECORDがあります。単一のルート・レベルの場合には、コンバータの動作は同じであるためレベル番号は問題ではありません。このCOBOLコピーブックでは、仮想小数点として宣言されたフィールド(PO-ITEM-PRICE)の例も示しています。
05 PO-RECORD.
10 PO-BUYER.
15 PO-UID PIC 9(7).
15 PO-NAME PIC X(15).
15 PO-ADDRESS.
20 PO-STREET PIC X(15).
20 PO-CITY PIC X(10).
20 PO-ZIP PIC 9(5).
20 PO-STATE PIC X(2).
10 PO-ITEM.
15 POITEM OCCURS 3 TIMES.
20 PO-LINE-ITEM.
25 PO-ITEM-ID PIC 9(3).
25 PO-ITEM-NAME PIC X(40).
25 PO-ITEM-QUANTITY PIC 9(2).
25 PO-ITEM-PRICE PIC 9(5)V9(2).
10 PO-TOTAL PIC 9(7)V9(2).
生成されるスキーマは次のようになります。
例 - 生成されたスキーマ
<?xml version="1.0" encoding="UTF-8" ?>
<!--Native format was generated from COBOL copybook:D:\work\
jDevProjects\CCB\Copybooks\po-ccb.cpy-->
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
xmlns:extn="http://xmlns.oracle.com/
pcbpel/nxsd/extensions"
targetNamespace=
"http://TargetNamespace.com/ccb/singleRoot"
xmlns:tns="http://TargetNamespace.com/ccb/singleRoot"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:version="NXSD" nxsd:encoding=
"cp037" nxsd:byteOrder="bigEndian"
nxsd:stream="chars">
<xsd:element name="Root-Element">
<xsd:complexType>
<xsd:sequence>
<!--COBOL declaration : 05 PO-RECORD -->
<xsd:element name="PO-RECORD"
minOccurs="1"
maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<!--COBOL declaration : 10 PO-BUYER-->
<xsd:element name="PO-BUYER">
<xsd:complexType>
<xsd:sequence>
<!--COBOL declaration : 15 PO-UID PIC 9(7)-->
<xsd:element name="PO-UID"
type="xsd:long"
nxsd:style="fixedLength"
nxsd:padStyle="head"
nxsd:paddedBy="0" nxsd:length="7"/>
<!--COBOL declaration :
15 PO-NAME PIC X(15)-->
<xsd:element name="PO-NAME"
type="xsd:string"
nxsd:style="fixedLength"
nxsd:padStyle="tail"
nxsd:paddedBy=" "
nxsd:length="15"/>
<!--COBOL declaration : 15 PO-ADDRESS-->
<xsd:element name="PO-ADDRESS">
<xsd:complexType>
<xsd:sequence>
<!--COBOL declaration :
20 PO-STREET PIC X(15)-->
<xsd:element name="PO-STREET"
type="xsd:string"
nxsd:style="fixedLength"
nxsd:padStyle="tail" nxsd:paddedBy=" "
nxsd:length="15"/>
<!--COBOL declaration :
20 PO-CITY PIC X(10)-->
<xsd:element name="PO-CITY"
type="xsd:string"
nxsd:style="fixedLength"
nxsd:padStyle="tail"
nxsd:paddedBy=" "
nxsd:length="10"/>
<!--COBOL declaration :
20 PO-ZIP PIC 9(5)-->
<xsd:element name="PO-ZIP"
type="xsd:long"
nxsd:style="fixedLength"
nxsd:padStyle="head"
nxsd:paddedBy="0"
nxsd:length="5"/>
<!--COBOL declaration :
20 PO-STATE PIC X(2)-->
<xsd:element name="PO-STATE"
type="xsd:string"
nxsd:style="fixedLength"
nxsd:padStyle="tail"
nxsd:paddedBy=" "
nxsd:length="2"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<!--COBOL declaration : 10 PO-ITEM-->
<xsd:element name="PO-ITEM">
<xsd:complexType>
<xsd:sequence>
<!--COBOL declaration :
15 POITEM OCCURS 3 TIMES-->
<xsd:element name="POITEM" minOccurs="3"
maxOccurs="3">
<xsd:complexType>
<xsd:sequence>
<!--COBOL declaration : 20 PO-LINE-ITEM-->
<xsd:element name="PO-LINE-ITEM">
<xsd:complexType>
<xsd:sequence>
<!--COBOL declaration :
25 PO-ITEM-ID PIC 9(3)-->
<xsd:element name="PO-ITEM-ID"
type="xsd:long"
nxsd:style="fixedLength"
nxsd:padStyle="head"
nxsd:paddedBy="0"
nxsd:length="3"/>
<!--COBOL declaration :
25 PO-ITEM-NAME PIC X(40)-->
<xsd:element name="PO-ITEM-NAME"
type="xsd:string"
nxsd:style="fixedLength"
nxsd:padStyle="tail"
nxsd:paddedBy=" "
nxsd:length="40"/>
<!--COBOL declaration :
25 PO-ITEM-QUANTITY
PIC 9(2)-->
<xsd:element name="PO-ITEM-QUANTITY"
type="xsd:long"
nxsd:style="fixedLength"
nxsd:padStyle="head"
nxsd:paddedBy="0"
nxsd:length="2"/>
<!--COBOL declaration :
25 PO-ITEM-PRICE PIC
9(5)V9(2)-->
<xsd:element name="PO-ITEM-PRICE"
type="xsd:decimal"
nxsd:style="virtualDecimal"
extn:assumeDecimal="5"
extn:picSize="7"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<!--COBOL declaration : 10 PO-TOTAL PIC 9(7)V9(2)-->
<xsd:element name="PO-TOTAL" type="xsd:decimal"
nxsd:style="virtualDecimal"
extn:assumeDecimal="7"
extn:picSize=" "/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
05 EMP-RECORD .
10 EMP-NAME PIC X(30).
10 EMP-DIV-NUM PIC 9(5).
10 DIV-ENTRY OCCURS 1 TO 50 TIMES
DEPENDING ON EMP-DIV-NUM.
20 DIV-CODE PIC X(30).
次の例に、生成されたスキーマを示します。
例 - 可変長配列の生成されたスキーマ
<?xml version="1.0" encoding="UTF-8" ?>
<!--Native format was generated from COBOL copybook:D:\work\
jDevProjects\CCB\Copybooks\odo.cpy-->
<xsd:schema xmlns:xsd=
"http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
xmlns:extn="http://xmlns.oracle.com/
pcbpel/nxsd/extensions"
targetNamespace=
"http://TargetNamespace.com/
ccb/varLengthArray"
xmlns:tns="http://TargetNamespace.com/
ccb/varLengthArray"
elementFormDefault="qualified"
attributeFormDefault=
"unqualified"
nxsd:version="NXSD" nxsd:encoding="cp037"
nxsd:byteOrder="bigEndian"
nxsd:stream="chars">
<xsd:element name="Root-Element">
<xsd:complexType>
<xsd:sequence>
<!--COBOL declaration :05 EMP-RECORD -->
<xsd:element name="EMP-RECORD"
minOccurs="1"
maxOccurs="unbounded">
<xsd:annotation>
<xsd:appinfo>
<nxsd:variables>
<nxsd:variable name="DIV-ENTRY_var0"/>
</nxsd:variables>
</xsd:appinfo>
</xsd:annotation>
<xsd:complexType>
<xsd:sequence>
<!--COBOL declaration:10 EMP-NAME PIC X(30)-->
<xsd:element name="EMP-NAME"
type="xsd:string"
nxsd:style="fixedLength"
nxsd:padStyle="tail"
nxsd:paddedBy=" "
nxsd:length="30"/>
<!--COBOL declaration:10 EMP-DIV-NUM PIC 9(5)-->
<xsd:element name="EMP-DIV-NUM"
type="xsd:long"
nxsd:style="fixedLength"
nxsd:padStyle="head"
nxsd:paddedBy="0"
nxsd:length="5">
<xsd:annotation>
<xsd:appinfo>
<nxsd:variables>
<nxsd:assign name="DIV-ENTRY_var0"
value="${0}"/>
</nxsd:variables>
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
<!--COBOL declaration :10 DIV-ENTRY OCCURS 1 TO 50 TIMES DEPENDING ON
EMP-DIV-NUM-->
<xsd:element name="DIV-ENTRY"
nxsd:style="array"
nxsd:arrayLength=
"${DIV-ENTRY_var0}"
minOccurs="1"
maxOccurs="50">
<xsd:complexType>
<xsd:sequence>
<!--COBOL declaration : 20 DIV-CODE PIC X(30)-->
<xsd:element name=
"DIV-CODE" type="xsd:string"
nxsd:style="fixedLength"
nxsd:padStyle="tail"
nxsd:paddedBy=" "
nxsd:length="30"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
01 NUMERIC-FORMATS.
05 Salary PIC 9(5) COMP-3.
05 Rating PICTURE S9(5).
05 Age PIC 9(3) USAGE COMP.
05 Revenue PIC 9(3)V9(2).
05 Growth PIC S9(3) SIGN IS LEADING.
05 Computation COMP-1.
次の例に、生成されたスキーマを示します。
例 - 数値タイプの生成されたスキーマ
<?xml version="1.0" encoding="UTF-8" ?>
<!--Native format was generated from COBOL copybook :
D:\work\jDevProjects\CCB\Copybooks\numeric.cpy-->
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
xmlns:extn="http://xmlns.oracle.com/pcbpel/nxsd/extensions"
targetNamespace="http://TargetNamespace.com/ccb/numeric"
xmlns:tns="http://TargetNamespace.com/ccb/numeric"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:version="NXSD" nxsd:encoding="cp037"
nxsd:byteOrder="bigEndian"
nxsd:stream="bytes">
<xsd:element name="Numerics">
<xsd:complexType>
<xsd:sequence>
<!--COBOL declaration :01 NUMERIC-FORMATS-->
<xsd:element name="NUMERIC-FORMATS"
minOccurs="1" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<!--COBOL declaration : 05 Salary PIC 9(5) COMP-3-->
<xsd:element name="Salary"
type="xsd:long" nxsd:style="comp3"
extn:sign="unticked" extn:picSize="5"/>
<!--COBOL declaration:05 Rating PICTURE S9(5)-->
<xsd:element name="Rating"
type="xsd:string"
nxsd:style="signZoned" extn:sign="ticked"
extn:picSize="5"
extn:signPosn="tailUpperNibble"/>
<!--COBOL declaration:05 Age PIC 9(3) USAGE COMP-->
<xsd:element name="Age" type="xsd:long"
nxsd:style="comp"
extn:picSize="3" extn:sign="unticked"/>
<!--COBOL declaration:05 Revenue PIC 9(3)V9(2)-->
<xsd:element name="Revenue" type="xsd:decimal"
nxsd:style="virtualDecimal"
extn:assumeDecimal="3"
extn:picSize="5"/>
<!--COBOL declaration : 05 Growth PIC S9(3) SIGN IS LEADING-->
<xsd:element name="Growth" type="xsd:string"
nxsd:style="signZoned"
extn:sign="ticked"
extn:picSize="3"
extn:signPosn="headUpperNibble"/>
<!--COBOL declaration : 05 Computation COMP-1-->
<xsd:element name="Computation"
type="xsd:float"
nxsd:style="comp1" extn:sign="ticked"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
この場合、すべての数値のタイプはIBM COBOLフォーマットに応じて指定されたフォーマットに従います。異なるレイアウトを使用して異なるシステムで作成されたデータ・ファイルの場合は、生成されたスキーマを変更する必要があります。
nXSD注釈が正しいことや、生成されたXML/ネイティブ・データがビジネス・セマンティクスに準拠していることを確認するために、nXSDスキーマのテストが必要になる場合があります。現在この作業を行うには、インバウンドまたはアウトバウンド、あるいはその両方のファイル・アダプタ・パートナ・リンクを含んだBPELプロセスを記述し、適切なnXSDスキーマで構成した後、SOAサーバー上でそれらをテストする必要があります。この場合、作業に時間がかかり、エラーも起こりやすくなります。
単純なスタンドアロン・テスト・クライアントを使用することで、NXSDスキーマを検証できるようになります。テスト・ツールjarは、http://download.oracle.com/otndocs/test-translator.jarからダウンロードできます
テスト・クライアントを使用してnXSDスキーマを検証する前に、次のjarをクラスパスに追加します。これらのjar (test-translator.jarを除く)は、SOAインストールに含まれています。テスト・クライアントを実行するには、Java 6を使用する必要があります。
bpm-infra.jar。これはnXSDランタイムjarで、$SOA_HOME/soa/modules/oracle.soa.fabric_11.1.1にあります
xmlparserv2.jar。これは解析用のOracle XDKライブラリで、$FMW_HOME/oracle_common/modules/oracle.xdk_11.1.0にあります
xml.jar これはスキーマ検証用のOracle XDKライブラリで、$FMW_HOME/oracle_common/modules/oracle.xdk_11.1.0にあります
mail.jar。これはJavaメールAPIです。
test-translator.jar。jarrからjarに拡張子を変更する必要があります。
java xlator.util.Translate -helpを実行すると、図6-71に示すように使用方法が表示されます。-helpオプションを指定することで、ツールのオプションおよびデフォルトのリストを表示できます。
次の例では、テスト・クライアントを実行してaddress-csv.txtファイルをaddress-csv.xmlに変換しています。
コマンドは、java xlator.util.Translate -inbound -schema address-csv.xsd -root Root-Element -input address-csv.txt -output address-csv.xmlです
テスト・クライアントを実行してaddress-csv.xmlをaddress-csv.txtに変換する例は、次のとおりです。
java xlator.util.Translate -outbound -schema address-csv.xsd -root Root-Element -input address-csv.xml -output address-csv.txt
次のテスト・クライアントの実行例では、デバッチ処理を使用してaddress-csv.txtを一連のaddress-csv.xml_batch_%SEQ%.xmlファイルに変換します。
java xlator.util.Translate -inbound -debatch 1 -schema address-csv.xsd -root Root-Element -input address-csv.txt -output address-csv.xml
図6-74 テスト・ツールを使用したaddress-csv.txtから一連のバッチxmlファイルへの変換

Oracle WebLogic統合では、ネイティブ・データを記述する固有の言語である特定のXMLファイル形式(MFLフォーマット言語と呼ばれます)を使用します。MFLはXMLですがスキーマ・ファイルではないため、nXSDファイルを使用しないでSOAトランスフォーメーションおよびマッピングにMFLを使用することはできません。
MFL変換機能により、既存のフレームワークでのMFLのプラガビリティが向上し、MFLフォーマットに対応するスキーマが生成されます。その後、生成されたスキーマを実行時に使用できます。
MFLの詳細は、Open Service Busのドキュメント『Oracle Service Busでのサービスの開発』のメッセージ・フォーマット言語を使用したデータの変換に関する説明を参照してください。
JDeveloperを使用して、ネイティブ・フォーマット・ビルダーのトランスレータが使用するスキーマ・ファイルを生成します。MFLファイルにはそれらに関連するターゲット・ネームスペースがないため、生成されたスキーマ・ファイルにターゲット・ネームスペースを指定する必要があります。
MFLからスキーマ・ファイルに変換するときに、生成されたスキーマ・ファイルをSOAプロジェクトのXSDディレクトリに保存した場合は、この手順をスキップできます。
SOAプロジェクト以外のディレクトリでスキーマ・ファイルを生成した場合、ステップ1で生成したスキーマ・ファイルをSOAコンポジット・プロジェクトのXSDフォルダに追加する必要があります。
スキーマ・ファイルをSOAプロジェクトに追加すると、変数へのペイロード・トランスフォーメーションまたはペイロード・マッピングにプロジェクトのスキーマ・ファイルを使用する場合と同様に、このスキーマ・ファイルを使用できます。実行時トランスレータは、スキーマ・ファイルで定義した属性を使用して、実行時にMFLトランスレータを起動します。
MFLファイルの例は次のとおりです。
<?xml version='1.0' encoding='windows-1252'?>
<!DOCTYPE MessageFormat SYSTEM 'mfl.dtd'>
<MessageFormat name='Root-Element' version='2.01'>
<StructFormat name='Address' repeat='*'>
<FieldFormat name='Name' type='String' delim=',' codepage='windows-1252'/>
<FieldFormat name='Street1' type='String' delim=',' codepage='windows-1252'/>
</StructFormat>
</MessageFormat>
MFLファイルから作成されるスキーマ・ファイルには、次の2つの新しいネームスペースがあります。
xmlns:mfl="http://www.bea.com/mfl"
xmlns:nxsd=http://xmlns.oracle.com/pcbpel/nxsd
さらに、スキーマのNXSDトランスレータのバージョンが、次のようにMFLに設定されます(nxsd:version="MFL")。
MFLファイルから作成されるスキーマ・ファイルの例を次に示します。
例 - MFLファイルから作成されるスキーマ・ファイルの例
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://MyTNS1"
targetNamespace="http://MyTNS1"
xmlns:mfl="http://www.bea.com/mfl" xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
elementFormDefault="qualified"
nxsd:version="MFL">
<xsd:import namespace="http://www.bea.com/mfl"
schemaLocation="mfl.xsd"/>
<xsd:element name="Root-Element">
<xsd:annotation>
<xsd:appinfo>
<mfl:MessageFormat encoding="windows-1252"/>
</xsd:appinfo>
</xsd:annotation>
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Address" minOccurs="1"
maxOccurs="unbounded">
<xsd:annotation>
<xsd:appinfo>
<mfl:StructFormat repeat="*"/>
</xsd:appinfo>
</xsd:annotation>
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Name" type="mfl:String">
<xsd:annotation>
<xsd:appinfo>
<mfl:FieldFormat delim=","
codepage="windows-1252"/>
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
<xsd:element name=
"Street1" type="mfl:String">
<xsd:annotation>
<xsd:appinfo>
<mfl:FieldFormat delim=","
codepage="windows-1252"/>
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
多くの場合、固定長のデータ長は文字ではなくバイトで使用できます。フィールド・データは、マルチバイト・キャラクタ・エンコーディングです。
この場合、バイト数はフィールドの文字数と等しくなりません。このタイプのデータの読取りは、NXSDトランスレータではサポートされていません。
現在、トランスレータでは文字の長さのみが想定されています。トランスレータは、文字リーダーを使用して指定の文字数を読み取ります。
マルチバイト・ストリーミングのサポートによって、フィールドの長さをバイトで指定できます。トランスレータはバイト・リーダーを使用して指定のバイト数を読み取り、読み取ったバイトを文字に変換します。これらの文字は生成されたXMLに配置されます。
同様に、アウトバンド・トランスレータはXMLデータを指定のバイト長に変換し、これらのバイトを出力ストリームに書き込みます。
ネイティブ・フォーマット・ビルダーを使用するときは、多くの場合デリミタを使用します。ネイティブ・フォーマット・ビルダー内でのデリミタの動作は、使用するコンテキストによって異なります。
たとえば、スキーマ・ドキュメントにオプション・ノードがある場合、親のデリミタの存在は、ネイティブ・ストリームにこれらのオプション・ノードに対応するデータがない可能性があることを示しています。または、親のデリミタ自体がオプション・ノードのデータの一部である可能性があります。すべては、コンテキストに依存します。
同様に、アウトバウンド・シナリオでは、グループの最終フィールドを処理するときに、グループ・デリミタが後に続く最終フィールドのデリミタを配置するのか、単にグループ・デリミタを配置するだけで十分なのかといったヒントをNXSDトランスレータに示す必要がある場合があります。
共有デリミタのアプローチによって、NXSDトランスレータは、コンテキストに基づいてデリミタが暗示するこのような微妙な相違に対応し、コンテキスト内のデリミタの意味を制御するためのカスタム注釈を提供します。
共有デリミタは、デリミタがデータ・グループの最後とグループの最終フィールドの最後の両方にマーク付けすることを意味します。デリミタは、グループの最終フィールドとグループの最後の間で共有されます。
NXSDフレームワークでは、配列を使用して繰返し構造を定義します。nxsd:cellSeparatedByコンストラクトは、配列の各セルのデリミタを定義します。このデリミタは、この構造の最終フィールドのデリミタより前に検出された場合に、構造のセルと最終フィールドの両方を終了するために使用します。
nxsd:arrayTerminatedByコンストラクトは、配列自体の最後にマーク付けします。cellSeparatedByデリミタよりも前に検出された場合に、セルと配列を終了するために使用します。
次の用語は、共有デリミタの概念を理解する上で重要です。
最終の非オプション・ノード: 配列でラップされた列構造に存在するノード。このノードは必須で、これより後ろの後続ノードはすべてオプションです。
後続のオプション・ノード: 配列でラップされた列構造に存在するノード。このノードはオプションで、このノードより後ろの後続ノードはすべてオプションです。
保留中のデリミタのリスト: 隣接した親配列デリミタ(これ自体が、共有デリミタを含む配列の最後の必須ノードである場合があります)から始まるすべてのデリミタを含むリスト。
配列: セルの集合。
配列の終端文字: 配列の最後にマーク付けします。
セル・セパレータ: 配列の各セルの最後にマーク付けします。
各セルには構造を含めることができます(一般的に構造は繰り返されるため、配列で囲まれます)。
構造には、必須要素とオプション要素を含めることができます。
デリミタは、次の異なるレベルで存在できます。
フィールド・レベル
グループ・レベル
セル・セパレータまたは配列の終端文字のいずれか、またはその両方をグループの要素と共有できます。セル・セパレータは、セルの共有境界を定義します。配列の終端文字は配列を定義し、配列に後続のオプション・フィールドがあるかどうかを指定します。
次の2つの注釈を使用して、グループの要素と共有される終端文字を指定できます。
nxsd:cellSeparator="shared" 配列のセル・セパレータを、最後の非オプション・フィールドのデリミタまたは後続オプション・フィールドのデリミタと共有することを定義します。この注釈のデフォルト値はnonsharedです。この場合、共有モードで、トランスレータが配列内の最後の非オプション・フィールドまたは後続オプション・フィールドの処理中にセル・セパレータを検出すると、トランスレータはこのフィールドが終了し、配列に後続オプション・フィールドが含まれないとみなします。フィールドが終了し、後続オプション・フィールドがない場合、トランスレータはセルとともに現在のフィールドを閉じます。
nxsd:arrayTerminator="shared" 配列の終端文字は、セル・セパレータおよび最後の非オプション・フィールドと共有されるか、後続オプション・フィールドと共有されます。
この属性のデフォルト値はnonsharedです。この場合、トランスレータが最後の非オプション・フィールドまたは後続オプション・フィールドの処理中に配列の終端文字を検出すると、トランスレータは現在のフィールドが終了し、配列に後続オプション・フィールドが含まれないとみなします。
配列が終了し、後続オプション・フィールドがない場合、トランスレータは現在のフィールド、現在のセルおよび配列を閉じます。
共有デリミタの動作もセルの性質に依存します。その他のタイプに加えて、次の3つの主要な動作タイプがあります。
終了
固定長
囲み
終了動作は、後続オプションの子にデリミタがあるかどうか、親デリミタの1つが検出されるかどうかに依存します。
後続オプションの子が終了している場合、トランスレータはネイティブ・データから読み取り、子の終端文字と保留中のデリミタの両方を検索します。
後続オプションの子の終端文字が検出された場合、オプションの子を生成します。
ただし、親デリミタの1つが検出された場合、読み取ったデータを現在のオプションの子にマップし、それをXMLで生成し、すべての後続オプションを無視し、親デリミタが検出されたレベルまで親構造を閉じます。
固定長動作は、固定長である後続オプションの子、または保留中のデリミタが存在するかどうかに関連します。
後続オプションの子が固定長の場合、子を処理する前に保留中のデリミタを検索します。
親デリミタの1つが検出された場合、後続オプションを無視して、親デリミタ構造まで構造を閉じます。
保留中のデリミタが存在しない場合、トランスレータはこのオプション・ノードに対応する固定長の文字数を読み取り、固定長の一部となる場合は保留中のデリミタをバイパスし、XMLでオプション・ノードを生成します。
注意:
NXSDトランスレータは、固定長データの最初に共有デリミタが実際に存在するシナリオに対応していません(固定長データを引用としてエスケープできません)。
囲み動作は、子が囲まれているかどうか、surroundedByデリミタの動作および親デリミタの存在に依存します。
後続オプションの子が囲まれている場合、子を処理する前に保留中のデリミタを検索します。
保留中のデリミタが存在しない場合、このオプション・ノードに対応する囲まれているネイティブ・データを読み取り、surroundedByの前にある場合は保留中のデリミタをバイパスし、XMLでオプション・ノードを生成します。次の後続オプション・ノードに対してこのロジックを繰り返します。
親デリミタの1つが検出された場合、後続オプションを無視して、親デリミタ構造が特定されるまで構造を閉じます。
カンマは、NXSDスキーマで共有のセル・セパレータと配列セパレータの両方として使用される場合、出力内の最初で唯一の要素になります。
たとえば、入力ネイティブ・データがField1、Field2、Field3、Field4、Field5で、
cellSeparatedBy=','とarrayTerminatedBy=','、およびその両方を共有すると、結果は最初のフィールドのみになります。例:
<sharedDelim xmlns="http://xmlns.mydomain.com/pcbpel/nxsd/test">
<Group1>
<Group2>
<Field1>Field1</Field1>
</Group2>
</Group1>
</sharedDelim>
この項の使用例は、後続オプションの子が終了しているかどうか、後続オプションの子の終端文字が検出されるかどうか、親デリミタの1つが検出されるかどうかといった、終了動作に関連しています。
使用例のスキーマの図は図6-79、使用例の説明は表6-11を参照してください。説明にはフィールドのリストが含まれています。
表6-11 終了の使用例
| 番号 | 名前 | 使用例の説明 | 出力 |
|---|---|---|---|
1 |
|
Field1#Field2$@Field11#Field22$^Field3%! --- 後ろにfield3が続くgroup2の2つのセルは、group1のセル1つのみで構成されます。 |
<sharedDelim>
<Group1>
<Group2>
<Field1>Field1</Field1>
<Field2>Field2</Field2>
</Group2>
<Group2>
<Field1>Field11</Field1>
<Field2>Field22</Field2>
</Group2>
<Field3>Field3</Field3>
</Group1>
</sharedDelim>
|
2 |
|
Field1@Field11#Field22$^Field3%! --- group2の2つのセル。1つ目にはオプションのField2がなく、2つ目にはオプションのField2があります。Field3とともに、配列Group1の1つのセルで構成されます。 |
<sharedDelim>
<Group1>
<Group2>
<Field1>Field1</Field1>
</Group2>
<Group2>
<Field1>Field11</Field1>
<Field2>Field22</Field2>
</Group2>
|
3 |
|
Field1@Field11#Field22! --- group2の2つのセル。1つ目にはオプションのField2がなく、2つ目にはオプションのField2があります。オプションのField3がなく、これはGroup1の1つのセルで構成されます。 |
<sharedDelim>
<Group1>
<Group2>
<Field1>Field1</Field1>
</Group2>
<Group2>
<Field1>Field11</Field1>
<Field2>Field22</Field2>
</Group2>
</Group1>
</sharedDelim>
|
4 |
Terminated_example_4.xsd |
Field1! --- オプションのField2がないGroup2の1つのセルは、Group1の1つのセルで構成され、オプションのField3はありません。 |
<sharedDelim> <Group1> <Group2> <Field1>Field1</Field1> </Group2> </Group1> </sharedDelim> |
5 |
Terminated_example_5.xsd |
Field0!Field1#Field2$@Field11#Field22$^Field3%!Field111! --- Group1の3つのセル。1つ目のセルには、オプションのField2とオプションのField3がないGroup2のセルが1つあります。2つ目のセルには両方のフィールドがあるGroup2のセルが2つあり、オプションのField3が含まれています。 3つ目のセルは、1つ目のセルと同じです。 |
<sharedDelim>
<Group1>
<Group2>
<Field1>Field0</Field1>
</Group2>
</Group1>
<Group1>
<Group2>
<Field1>Field1</Field1>
<Field2>Field2</Field2>
</Group2>
<Group2>
<Field1>Field11</Field1>
<Field2>Field22</Field2>
</Group2>
<Field3>Field3</Field3>
</Group1>
<Group1>
<Group2>
<Field1>Field111</Field1>
</Group2>
</Group1>
</sharedDelim>
|
この項の使用例は、すべて固定長の使用例です。
使用例のスキーマの図は図6-80、使用例の説明は表6-12を参照してください。説明にはフィールドのリストが含まれています。
表6-12に、固定長の使用例の名前、使用例の説明および結果の出力を示します。
表6-12 固定長の使用例
| 番号 | 名前 | 使用例の説明 | 出力 |
|---|---|---|---|
1 |
|
Field01#Field02@Field11#Field12^! --- Group1のセル1つにGroup2のセルが2つあります。Group2の各セルには、必須で終了のField1要素とオプションで固定長のField2の両方があります。Group1グループに、オプションで固定長のField3はありません。 |
<fo_1>
<Group1>
<Group2>
<Field1>Field01</Field1>
<Field2>Field02</Field2>
</Group2>
<Group2>
<Field1>Field11</Field1>
<Field2>Field12</Field2>
</Group2>
</Group1>
</fo_1>
|
2 |
|
Field01! --- Group2の1つ目のセルには必須で固定長のField01があり、オプションで固定長のField2はありません。Group1には、オプションで固定長のField3はありません。 |
<fo_1> <Group1> <Group2> <Field1>Field01</Field1> </Group2> </Group1> </fo_1> |
3 |
|
Field01!Field11Field02@Field21Field12^Field03!Field31! --- Group1には3つのセルがあります。1つ目のセルには必須で固定長のField1のみが含まれます。2つ目のセルには、Group2のセルが2つ含まれます。2つのセルのそれぞれには、固定長フィールドのField1とField2の両方が含まれます。Group1の2つ目のセルには、固定長でオプションのField3も含まれます。Group1の3番目のセルは1つ目のセルと同じです。 |
<fo_1>
<Group1>
<Group2>
<Field1>Field01</Field1>
</Group2>
</Group1>
<Group1>
<Group2>
<Field1>Field11</Field1>
<Field2>Field02</Field2>
</Group2>
<Group2>
<Field1>Field21</Field1>
<Field2>Field12</Field2>
</Group2>
<Field3>Field03</Field3>
</Group1>
<Group1>
<Group2>
<Field1>Field31</Field1>
</Group2>
</Group1>
</fo_1>
|
囲みの使用例には、トランスレータが検索する場所が含まれています。
後続オプションの子が囲まれている場合は保留中のデリミタを検索し、保留中のデリミタが存在しない場合は、このオプション・ノードに対応する囲まれたデータを読み取り、保留中のデリミタがsurroundedByデリミタより前にある場合は保留中のデリミタをバイパスし、最終的にXMLでオプション・ノードを生成します。
表6-13 囲みの使用例
| 番号 | 名前 | 使用例の説明 | 出力 |
|---|---|---|---|
1 |
|
Field01#Field02@Field11#Field12^[Field03]! --- Group1には、繰返し構造のGroup2とオプションで囲みのField3で構成されるセルが1つあります。Group2には、必須で終了のField1とオプションで囲みのField2の両方があるセルが2つあります。 |
<sharedDelim>
<Group1>
<Group2>
<Field1>Field1</Field1>
<Field2>Field2</Field2>
</Group2>
<Group2>
<Field1>Field11</Field1>
<Field2>Field22</Field2>
</Group2>
<Field3>Field3</Field3>
</Group1>
</sharedDelim>
|
2 |
|
Field01#@Field11#Field12^! |--- Group1は繰返し構造のGroup2で構成された1つのセルで、オプションで囲みのField3はありません。Group2にはセルが2つあります。1つ目のセルには必須で終了のField1がありますが、オプションで囲みのField2はありません。2つ目のセルには両方のフィールドが含まれます。 |
<fo_1> <Group1> <Group2> <Field1>Field01</Field1> </Group2> <Group2> <Field1>Field11</Field1> <Field2>Field12</Field2> </Group2> </Group1> </fo_1> |
3 |
|
|
<fo_1> <Group1> <Group2> <Field1>Field01</Field1> </Group2> </Group1> </fo_1> |
4 |
|
Field01!Field11-Field02-@Field21-Field12-^[Field03]!Field31! --- Group1にはセルが3つあります。1つ目のセルには必須で固定長のField1のみを含むGroup2のセルが1つあり、オプションで囲みのField2はありません。Group1の2つ目のセルには、Group2 (両方のフィールドを含む)のセルが2つとField3が含まれています。Group1の3番目のセルは1つ目と同じです。 |
<fo_1>
<Group1>
<Group2>
<Field1>Field01</Field1>
</Group2>
</Group1>
<Group1>
<Group2>
<Field1>Field11</Field1>
<Field2>Field02</Field2>
</Group2>
<Group2>
<Field1>Field21</Field1>
<Field2>Field12</Field2>
</Group2>
<Field3>Field03</Field3>
</Group1>
<Group1>
<Group2>
<Field1>Field31</Field1>
</Group2>
</Group1>
</fo_1>
|
次の使用例は、共有デリミタの様々なタイプの使用方法を集めたものです。
この共有配列の終端文字の使用例のサンプル・データは、次のとおりです。
"Smith, John","0161-499-1717" Fred,"0161-499-1718"#^"Smith, John","0161-499-1717" #*
次に、この使用例のXSDを示します。
例 - 共有配列の終端文字のサンプルXSD
<?xml version="1.0" encoding="US-ASCII"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
targetNamespace="http://xmlns.oracle.com/pcbpel/nxsd/smoketest"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:stream="chars"
nxsd:version="NXSD">
<element name="arrayTerminator">
<complexType>
<sequence>
<element name="arrayOfMembers" maxOccurs="unbounded"
nxsd:style="array" nxsd:cellSeparator="nonshared" nxsd:cellSeparatedBy="^" nxsd:arrayTerminatedBy="*">
<complexType>
<sequence>
<element name="Member" maxOccurs="unbounded"
nxsd:style="array" nxsd:arrayTerminatedBy="#" nxsd:arrayTerminator="shared">
<complexType>
<sequence>
<element name="Name" type="string" nxsd:style="terminated" nxsd:terminatedBy="," nxsd:quotedBy='"'/>
<element name="Telephone" type="string" nxsd:style="terminated" nxsd:terminatedBy="${eol}" nxsd:quotedBy='"'/>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
生成されるXMLは次のとおりです。
例 - 共有配列の終端文字に対して生成されるXMLのサンプル
<arrayTerminator xmlns="http://xmlns.oracle.com/pcbpel/nxsd/smoketest">
<arrayOfMembers>
<Member>
<Name>Smith, John</Name>
<Telephone>0161-499-1717</Telephone>
</Member>
<Member>
<Name>Fred</Name>
<Telephone>0161-499-1718</Telephone>
</Member>
</arrayOfMembers>
<arrayOfMembers>
<Member>
<Name>Smith, John</Name>
<Telephone>0161-499-1717</Telephone>
</Member>
</arrayOfMembers>
</arrayTerminator>
shared.trailingArray.xsdのサンプル・データは次のとおりです。
"Smith, John","0161-499-1717" Fred,"0161-499-1718"^"Smith, John","0161-499-1717" #*
この使用例のサンプルNXSDスキーマを次に示します。
例 - 共有の後続配列のサンプルNXSDスキーマ
<?xml version="1.0" encoding="US-ASCII"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
targetNamespace="http://xmlns.oracle.com/pcbpel/nxsd/smoketest"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:stream="chars"
nxsd:version="NXSD">
<element name="trailingArray">
<complexType>
<sequence>
<element name="arrayOfMembers" maxOccurs="unbounded"
nxsd:style="array" nxsd:cellSeparator="shared" nxsd:cellSeparatedBy="^" nxsd:arrayTerminatedBy="*">
<complexType>
<sequence>
<element name="Member" maxOccurs="unbounded"
nxsd:style="array" nxsd:arrayTerminatedBy="#" nxsd:arrayTerminator="shared">
<complexType>
<sequence>
<element name="Name type="string" nxsd:style="terminated" nxsd:terminatedBy="," nxsd:quotedBy='"'/>
<element name="Telephone" type="string" nxsd:style="terminated" nxsd:terminatedBy="${eol}" nxsd:quotedBy='"' minOccurs="0"/>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
次の例に、この使用例の生成されたXMLを示します。
例 - 共有の後続配列の使用例に対して生成されるXML
<trailingArray xmlns="http://xmlns.oracle.com/pcbpel/nxsd/smoketest">
<arrayOfMembers>
<Member>
<Name>Smith, John</Name>
<Telephone>0161-499-1717</Telephone>
</Member>
<Member>
<Name>Fred</Name>
<Telephone>0161-499-1718</Telephone>
</Member>
</arrayOfMembers>
<arrayOfMembers>
<Member>
<Name>Smith, John</Name>
<Telephone>0161-499-1717</Telephone>
</Member>
</arrayOfMembers>
</trailingArray>
</element>
この共有のtrailingOptionalArrayの使用例のサンプル・データを次の例に示します。
例 - 共有の後続オプション配列の使用例のサンプル・データ
"Smith, John","0161-499-1717" Fred^"Smith, John","0161-499-1717"#*
例 - 共有の後続オプション配列の使用例のNXSD
<?xml version="1.0" encoding="US-ASCII"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd"
targetNamespace=
"http://xmlns.oracle.com/pcbpel/nxsd/smoketest"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
nxsd:stream="chars"
nxsd:version="NXSD">
<element name="trailingOptionalArray">
<complexType>
<sequence>
<element name="arrayOfMembers"
maxOccurs="unbounded"
nxsd:style="array" nxsd:cellSeparator=
"shared" nxsd:cellSeparatedBy="^" nxsd:arrayTerminatedBy="*">
<complexType>
<sequence>
<element name="Member"
maxOccurs="unbounded"
nxsd:style="array"
nxsd:arrayTerminatedBy="#"
nxsd:arrayTerminator="shared">
<complexType>
<sequence>
<element name=
"Name" type="string"
nxsd:style="terminated"
nxsd:terminatedBy=","
nxsd:quotedBy='"'/>
<element name="Telephone"
type="string"
nxsd:style="terminated"
nxsd:terminatedBy="${eol}" nxsd:quotedBy='"' minOccurs="0"/>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
例 - 共有の後続オプション配列の使用例に対して生成されるXML
<trailingOptionalArray xmlns="http://xmlns.oracle.com/pcbpel/nxsd/smoketest">
<arrayOfMembers>
<Member>
<Name>Smith, John</Name>
<Telephone>0161-499-1717</Telephone>
</Member>
<Member>
<Name>Fred</Name>
</Member>
</arrayOfMembers>
<arrayOfMembers>
<Member>
<Name>Smith, John</Name>
<Telephone>0161-499-1717</Telephone>
</Member>
</arrayOfMembers>
</trailingOptionalArray>