ノードは、外部データ表現内の階層化されたデータ構造内で、外部データ表現そのものと、その下位に使用される一連の区切り文字を定義します。ノードで区切り文字リストを定義している場合、上位の区切り文字リストは、このノード自体とその下位に一切影響しません。区切り記号リストは、通常、ルートノードに指定します。
たとえば、次のデータを解析する場合、
a^b|c^d|e |
OTD を次のように定義できます。
この OTD の区切り文字リストは、demo-otd 要素で指定するため、OTD 全体に適用され、2 つのレベルを持ちます。
レベル 1
区切り文字 |
レベル 2
区切り文字 ^
レベル 1 の区切り文字は、2 つの要素およびフィールド 5 に適用され、レベル 2 の区切り文字はフィールド 1 から 4 に適用されます。
区切り文字リストは、この非常に簡単な例よりもずっと複雑になることがあります。たとえば、任意の特定レベルで異なるタイプの区切り文字を複数作成したり、例のようにルートノードでだけでなく、OTD 内の任意のノードで区切り文字リストを指定したりすることができます。区切り文字リストの作成手順については、「OTD エディタを使用した OTD の変更」を参照してください。
区切り文字のプロパティー
区切り文字は、区切り文字リストエディタを使用して定義します。
区切り文字のプロパティーと値を表 1–4 に示します。
表 1–4 区切り文字のプロパティー
区切り文字のプロパティーと値のオプション |
||
---|---|---|
プロパティー |
オプション |
説明 |
レベル |
定義中のノードの下の子レベル。 |
|
タイプ |
escape |
エスケープシーケンス。 |
repeat |
配列区切り文字/セパレータ。 |
|
normal |
終端文字。 |
|
区切り文字バイト |
区切り文字 (単一または複数の文字)。 |
|
優先度 |
「優先度」を参照してください。 |
|
オプションモード |
never |
入力では許可せず、出力では発行しません (区切り文字間の空のフィールドは、長さゼロのデータフィールドを意味する)。 |
allow |
空のフィールドが存在する場合はスキップし、存在しない場合、出力では区切りません。 |
|
cheer |
空のフィールドが存在する場合はスキップし、存在しない場合、出力では区切ります。 |
|
force |
入力では空の区切られたフィールドが必須で、出力では常に区切ります。 |
|
ターミネータモード |
never |
入力では許可せず、出力では発行しません (純粋なセパレータ)。 |
allow |
入力では許可し、出力では発行しません。 |
|
cheer |
入力では許可し、出力では常に発行します。 |
|
force |
入力では必須で、出力では常に発行します (純粋な終端文字)。 |
タイププロパティー - Escape オプション
escape 区切り文字は、解析時に認識されて無視されるシーケンスです。その目的は、エスケープシーケンスの使用を許可して、データ内にバイトシーケンスを組み込むことで、この存在がないと、区切り文字の出現として見なされます。
たとえば、あるレベルに通常の区切り文字「+」が存在し、エスケープ区切り文字「\+」を定義した場合、aaa+b\+c+dddは 3 つのフィールド、aaa、b\+c、および ddd として解析されます。エスケープ区切り文字を定義しなかった場合、シーケンスは 4 つのフィールド、aaa、b\、c、および ddd として解析されます。
ただし、あるレベルでエスケープ区切り文字が 1 つのみの場合、delim および array ノードでは区切り文字の定義されていない状態を表します。
区切り文字バイト
基本的には、区切り文字として使用できる文字に制限はありません。ただし、データと混同する可能性のある文字や、エスケープシーケンスと衝突する文字は避けてください。バックスラッシュ (\) は通常、エスケープ文字として使用されます。HL7 プロトコルは、エスケープシーケンスの一部に二重のバックスラッシュを使用して特別なテキストフォーマット指示を与えます。
コロン (:) は区切り文字として使用しないでください。コロンは、システムが生成した時刻文字列でリテラルとして使用されます。これは、ドメインのシャットダウン後などの復旧手順を妨げる可能性があります。
ターミネータモードプロパティー
前の例に示したツリー構造を見てみましょう。この構造では、ノード a はその区切り文字としてパイプ (|) を、サブノード b はその区切り文字としてチルダ (~) を、サブノード c はその区切り文字としてアスタリスク (*) を持っています。
オプション |
入力 |
出力 |
---|---|---|
never |
c| |
c| |
allow |
c| または c*| |
c| |
cheer |
c| または c*| |
c*| |
force |
c*| |
c*| |
オプションモードプロパティー
次の図に示したツリー構造を見てみましょう。この構造では、ノード a はその区切り文字としてパイプ (|) を、サブノード b、c、および d はいずれもその区切り文字としてアスタリスク (*) を持っています。
例 1: サブノード c が optional の場合(サブノード c とサブノード d の match パラメータの値は異なる必要がある)。
オプション |
入力 |
出力 |
---|---|---|
never |
b*d| |
b*d| |
allow |
b**d| |
b*d| |
cheer |
b**d| |
b**d| |
force |
b**d| |
b**d| |
例 2: サブノード c とサブノード d の両方が optional の場合。
オプション |
入力 |
出力 |
---|---|---|
never |
b| |
b| |
allow |
b|、b*|、または b**| |
b| |
cheer |
b|、b*|、または b**| |
b**| |
force |
b**| |
b**| |
優先度
優先度は、ある区切り文字の他の区切り文字に対する優先順位を示します。デフォルトでは、すべての区切り文字の優先度は 10 で、つまり、すべての区切り文字は同様と見なされ、固定フィールドは優先度 10 でハードコードされます。親ノードの区切り文字は、子フィールドの解析時には考慮されず、子の区切り文字 (または子が固定フィールドの場合はその長さ) のみが考慮されます。
区切り文字の優先度を変更すると、入力データストリームに異なる方法で区切り文字が適用されるようになります。次に例を示します。
ルートノード
要素 (type delim, delimiter = “^”, repeat)
フィールド1 (type fixed, length = 5)
フィールド2 (type fixed, length = 8, optional)
これは「abcde12345678^zyxvuABCDEFGH」を解析しますが、テキスト「abcde^zyxvuABCDEFGH」は、2 番目の固定フィールドが optional であっても解析されません。これは、要素と固定フィールドの区切り文字の優先度が同じであるため、要素の区切り文字が固定フィールド内で無視されるからです。固定フィールドデータ内で要素の区切り文字が調べられるようにするには、次のようにその優先度を変更します。