XML 仮想ドキュメントのデータ変換の定義
この章では、ルール・セットで使用できるように、XML 仮想ドキュメントのデータ変換 (特に、DTL ベースの変換) を作成する方法を示します。
データ変換の作成
XML 仮想ドキュメントのデータ変換を作成するには、以下の操作を行います。
-
必要に応じて、1 つまたは複数の適用可能な XML スキーマを InterSystems IRIS® にロードします。
このドキュメントで前述した “InterSystems IRIS への XML スキーマのロード” を参照してください。
-
"DTL 変換の開発" 内の説明に従って、管理ポータルまたはスタジオで DTL エディタを使用します。
-
データ変換内で、以下の値を使用します。
-
[ソースクラス] および [ターゲットクラス] で、InterSystems IRIS で XML 仮想ドキュメントを示すためのクラスである [EnsLib.EDI.XML.Document] を使用します。
-
[ソース・ドキュメント・タイプ] で、必要に応じてそのメッセージで想定される XML タイプを選択します。InterSystems IRIS にロードした XML スキーマのいずれかから XML タイプを選択します。
スキーマをロードしていない、またはスキーマを使用したくない場合は、この値を空白のままにしてください。
-
[ターゲット・ドキュメント・タイプ] で、必要に応じて異なる XML タイプを選択するか、値を削除します。
[ソース・ドキュメント・タイプ] でユーザが選択した値がある場合はそれを使用して、[ターゲット・ドキュメント・タイプ] が初期化されます。
-
前の章で説明した XML プロパティ・パスを使用して、通常どおりデータ変換内にアクションを作成します。これには、以下の 2 つの基本的なシナリオがあります。
-
スキーマをロードし、ソースおよびターゲットの各ドキュメント・タイプを指定済みの場合は、DTL エディタに各ドキュメント構造がツリーとして表示されます。これにより、ドラッグ・アンド・ドロップすることで変換を作成できます。InterSystems IRIS によって、スキーマ依存パスを使用するアクションが作成されます。何らかの理由で DOM スタイル・パスをそれらのアクションで使用する必要がある場合は、そのように編集することもできます。
-
ドキュメント・タイプを指定しない場合、ドキュメント構造はツリーとして表示されません。その場合、アクションを手動で追加および編集する必要があります。使用できるのは、DOM スタイル・パスのみです。
いずれの場合も、より複雑な処理をサポートするためにコード要素を追加できます。
データ変換を保存してコンパイルすると、ルール・セットで使用できるようになります。これについては、“XML 仮想ドキュメントのルール・セットの定義” を参照してください。
XML 仮想ドキュメントの使用可能な割り当てアクション
XML 仮想ドキュメントに対して、InterSystems IRIS では以下の割り当てアクションがサポートされています。
-
[set] — 値を設定します。ターゲット要素のタイプが "any" の場合は、テキストに XML マークアップを含めることができます。XML マークアップは適切に構成される必要がありますが、何らかのスキーマに対して検証されることはありません。
ターゲット要素をソース・プロパティ・パスの値に設定する場合は、ソース・プロパティ・パスが存在している必要があります。そうでなければ、InterSystems IRIS によってターゲットが設定されず、エラーが返されます。これは、[存在しないソースセグメントとプロパティを無視する] 設定を有効にすることにより、必要に応じて無視できます。詳細は、"変換詳細の指定" を参照してください。
-
[append] — ターゲット要素内のサブノードの後に新しい値を追加します。
-
[clear] — ターゲットのテキスト・コンテキストは消去しますが、その要素およびすべての子は保持します。または、ターゲットが属性の場合、このアクションによってその値は消去されますが、属性は保持されます。
-
[remove] — ターゲット要素または属性を削除します。
[insert] はサポートされていません。
コードの使用
より複雑な処理をサポートするためにコード要素を追加する必要がある場合は、source および target 変数の GetValueAt() と SetValueAt() メソッドを直接呼び出します。EnsLib.EDI.XML.DocumentOpens in a new tab の場合、これらのメソッドは以下のようになります。
GetValueAt()
method GetValueAt(pPropertyPath As %String,
pFormat As %String,
Output pStatus As %Status) as %String
説明 :
-
pPropertyPath は、このドキュメントで前述したように、XML プロパティ・パスです。
-
pFormat は、返される文字列の形式を制御する一連のフラグです。次の項を参照してください。
-
pStatus は、成功または失敗を示すステータスです。
このメソッドによって、指定されたプロパティ・パスの現在の値、またはパスが有効でない場合は空の文字列が返されます。
SetValueAt()
method SetValueAt(pValue As %String,
pPropertyPath As %String,
pAction As %String = "set",
pKey As %String = "") as %Status
説明 :
-
pValue は、指定された XML プロパティ・パスの適切な値です。
-
pPropertyPath は、前の章で説明したように、XML プロパティ・パスです。
-
pAction は、"set"、"append"、"clear"、"remove" のいずれかです。詳細は、前の節を参照してください。
-
pKey は、XML 仮想ドキュメントには使用されません。
このメソッドによって、指定されたプロパティ・パスが評価され、(パスが有効な場合は) そのパスで pValue および pAction を使用して値が変更されます。
Important:
これらのメソッドによって返されたステータス値をチェックすると便利です。無効なパスを指定した場合や、許可されていないアクションを試行した場合、ステータスに具体的な情報が含まれます。特にこの情報はデバッグを行う際に役立ち、時間を節約することができます。
例 1 :ソース・ドキュメントの大部分をコピーする
ソース・ドキュメントの大部分をコピーするデータ変換を簡単に定義するには、データ変換ビルダで以下の操作を行います。
-
[変換] タブで、[作成] ドロップダウン・リストから [copy] を選択します。
これにより、デフォルトで、新しいドキュメントは元のドキュメントのコピーになります。
-
選択された要素または属性を部分的または完全に削除するアクションを定義します。そのようなアクションを定義するには、以下の操作を行います。
-
[アクション追加] で、[clear] または [remove] をクリックします。
-
クリアまたは削除したいターゲット・プロパティをダブルクリックします。
-
[値] に任意の値を入力します。このフィールドは必要ですが、この場合は無視されます。
以下に、スキーマ依存パスを使用する例を紹介します。
Class Demo02.MyDTL Extends Ens.DataTransformDTL
{
XData DTL [ XMLNamespace = "http://www.intersystems.com/dtl" ]
{
<transform sourceClass='EnsLib.EDI.XML.Document' targetClass='EnsLib.EDI.XML.Document'
sourceDocType='Demo02:Patient' targetDocType='Demo02:Patient' create='copy' language='objectscript' >
<assign value='"this value is ignored"' property='target.{WorkAddress}' action='remove' />
<assign value='"this value is ignored"' property='target.{HomeAddress}' action='remove' />
</transform>
}
Parameter REPORTERRORS = 1;
}
このデータ変換では、ソース・ドキュメントがターゲットにコピーされた後、<WorkAddress> および <HomeAddress> 要素がターゲットから削除されます。
以下に、DOM スタイル・プロパティ・パスを使用する同等の例を紹介します。
Class Demo02A.MyDTL Extends Ens.DataTransformDTL
{
XData DTL [ XMLNamespace = "http://www.intersystems.com/dtl" ]
{
<transform sourceClass='EnsLib.EDI.XML.Document' targetClass='EnsLib.EDI.XML.Document'
create='copy' language='objectscript' >
<assign value='"this value is ignored"' property='target.{/Patient/WorkAddress}' action='remove' />
<assign value='"this value is ignored"' property='target.{/Patient/HomeAddress}' action='remove' />
</transform>
}
Parameter REPORTERRORS = 1;
}
この場合、このデータ変換では、ドキュメント・タイプが不要なために指定されていないことに注意してください。
例 2 :ソース・ドキュメントのいくつかの部分のみを使用する
ソース・ドキュメントのいくつかの部分のみを使用するデータ変換を簡単に定義するには、データ変換ビルダで以下の操作を行います。
-
[変換] タブで、[作成] ドロップダウン・リストから [new] を選択します。
これにより、デフォルトで、新しいドキュメントが空になります。
-
選択された要素または属性をコピーするアクションを定義します。そのようなアクションを定義するには、ソース・ドキュメント領域からターゲット・ドキュメント領域にドラッグ・アンド・ドロップします。この方法で追加する各アクションは、[set] アクションです。
以下に、スキーマ依存パスを使用する例を紹介します。
Class Demo05.MyDTL Extends Ens.DataTransformDTL
{
XData DTL [ XMLNamespace = "http://www.intersystems.com/dtl" ]
{
<transform sourceClass='EnsLib.EDI.XML.Document' targetClass='EnsLib.EDI.XML.Document'
sourceDocType='Demo05:Patient' targetDocType='Demo05:Patient' create='new' language='objectscript' >
<assign value='source.{MRN}' property='target.{MRN}' action='set' />
<assign value='source.{PrimaryCarePhysician}' property='target.{PrimaryCarePhysician}' action='set' />
</transform>
}
Parameter REPORTERRORS = 1;
}
このデータ変換では、MRN および PrimaryCarePhysician プロパティのみがソースからターゲットにコピーされます。
以下に、DOM スタイル・プロパティ・パスを使用する同等の例を紹介します。
Class Demo05A.MyDTL Extends Ens.DataTransformDTL
{
XData DTL [ XMLNamespace = "http://www.intersystems.com/dtl" ]
{
<transform sourceClass='EnsLib.EDI.XML.Document' targetClass='EnsLib.EDI.XML.Document'
create='new' language='objectscript' >
<assign value='source.{/Patient/MRN}' property='target.{/Patient/MRN}' action='set' />
<assign value='source.{/Patient/PrimaryCarePhysician}'
property='target.{/Patient/PrimaryCarePhysician}' action='set' />
</transform>
}
Parameter REPORTERRORS = 1;
}
例 3 :code および SetValueAt() を使用する
以下の例では、[code] アクション・タイプ、および DOM スタイル・パスが使用されています。これにより、ルート要素に属性と XML コメントが追加されます。
Class Demo06.MyDTL Extends Ens.DataTransformDTL
{
XData DTL [ XMLNamespace = "http://www.intersystems.com/dtl" ]
{
<transform sourceClass='EnsLib.EDI.XML.Document' targetClass='EnsLib.EDI.XML.Document'
create='copy' language='objectscript' >
<code>
//this part adds an attribute to the document
set path="/1/@NewAttribute"
set status=target.SetValueAt("New attribute value",path)
if 'status {do ##class(MyApp.Utils).Trace("Demo06.MyDTL","Error setting path: ",path)}
//this part adds a comment to the document
set path="/1/comment()"
set status=target.SetValueAt("This is an XML comment",path)
if 'status {do ##class(MyApp.Utils).Trace("Demo06.MyDTL","Error setting path: ",path)}
</code>
</transform>
}
Parameter REPORTERRORS = 1;
}
SetValueAt() メソッドによってエラーが返されたら、この変換ではユーティリティ・メソッドを使用して詳細が記録されます。