Health Level 7 (HL7) Clinical Document Architecture (CDA) は、HL7 バージョン 3 (V3) メッセージングのメッセージ交換部分を作成するために使用した HL7 V3 リファレンス情報モデルに基づいています。HL7 メッセージングでは医療情報に関する個々のメッセージのやりとり (照会、応答、通知など) を表現しますが、HL7 CDA 文書は永続的に記録される単独の文書であり、患者の来院記録や、CCD (Continuity-of-Care Document) などを表現します。CDA に記載されている各エントリーには、コンピューターが読み取れる内容に加え、人間が読めるようにするためのテキストによる記述が含まれています (リスト 1)。厳密に言えば、HL7 V3 メッセージはネットワーク上を (例えば、クライアント・サーバー間のやり取りや、サーバーからサーバーへのデータ配布などの一環として) 転送されることを想定しています。しかし HL7 V3 メッセージは人間が読み取ることも想定しているため、E メールなどの他の手段で HL7 CDA 文書を転送することもできます。
リスト 1. CDA の observation エントリー: ペニシリン・アレルギー
<component>
<section>
<code code="10155-0" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC"/>
<title>Allergies and Adverse Reactions</title>
<text>
<list>
<item>Penicillin - Hives</item>
</list>
</text>
<entry>
<observation classCode="OBS" moodCode="EVN">
<code xsi:type="CD" code="247472004" codeSystem="2.16.840.1.113883.6.96"
codeSystemName="SNOMED CT" displayName="Hives"/>
<statusCode code="completed"/>
<entryRelationship typeCode="MFST">
<observation classCode="OBS" moodCode="EVN">
<code xsi:type="CD" code="91936005"
codeSystem="2.16.840.1.113883.6.96"
codeSystemName="SNOMED CT"
displayName="Allergy to penicillin"/>
<statusCode code="completed"/>
</observation>
</entryRelationship>
</observation>
</entry>
</section>
</component>
|
Saxon パーサーは数年前からサーバー・サイドで XSLT 2.0 変換をサポートしています。最近、XML Prague 2011 カンファレンスにおいて、最初の Saxon パーサーを作成した Michael Kay 博士が Saxon Client Edition (Saxon-CE) のアルファ・リリースを紹介しました。Saxon-CE を使用すると、(ブラウザー内の) Web クライアント・アプリケーションから XSLT 2.0 変換を直接実行することができます。Saxon-CE は JavaScript を使用しており、最近のどのブラウザーでも実行することができます。クライアント・サイドで XSL を実行する上では、昔からブラウザーが問題となっていました。歴史的に、ブラウザーが異なると XSL のサポートの実装も異なり、ブラウザーを通じての一貫性がありませんでした。Saxon-CE はランタイム・エンジンとして JavaScript を使用しているため、その問題を解決しています。
また XSLT 2.0 には、複数文書のサポートや強い型付けのデータなど、最初の XSLT 1.0 仕様ではサポートされていなかった、いくつかの機能が用意されています。Saxon-CE により、これらの機能をクライアント・サイドでサポートできるようになります。そしてこの記事で説明するように、これらの機能のいくつかはクライアント・アプリケーションのビューに使用すると理想的であり、特にクライアント・サイドで複数の文書を扱う場合には最適です。
この記事では、後ほど説明する CDA ビューアー・アプリケーションを作成するために、最新の Opera リリースにパッケージ化されている Unite Web サーバーを使用しましたが、それ以外のアプリケーション・サーバーを使用することもできます。この記事で取り上げる内容に、クライアント・アプリケーションのビューの作成方法は含まれていますが、CDA 文書の永続化や配布の方法は含まれていません。この記事では、アプリケーションのビューをテストするために、単純にサンプルの CDA を URL として Web サーバーで直接公開しています (あるいは、CDA を IBM DB2 pureXML などの XML データベースに永続化することもできます)。同様に、XSL 変換も URL として公開しています。
Saxon-CE のアルファ・リリースは現在、Saxonica Web サイトからダウンロードすることができます (「参考文献」のリンクを参照)。現時点では、このアルファ・リリースは本番アプリケーションへの使用を想定していません。しかし最初の Saxon パーサーの成功を見ると、Client Edition もすぐに業界標準になることは間違いないと思います。特に、初期段階から採用する人達から好意的な評価が得られれば、すぐに業界標準となるでしょう。
アルファ・リリースには広範囲にわたるリリース・ノートが含まれています。他のすべての .js スクリプトの場合と同様、zip を解凍して生成されたリリース・フォルダーに含まれている JavaScript ファイルをアプリケーション・サーバーにコピーします。また、少し時間がかかりますが、サンプル・アプリケーションもダウンロードする必要があります。この JavaScript は 1 つの .nocache.js ファイルと、いくつもの縮小化された .js ファイルで構成されています (主要なブラウザーに対して 1 つの .js ファイルがあります)。これらのファイルに実際のパーサー・コードが含まれており、.nocache.js ファイルはどのブラウザーが使用されているかを検出し、それに該当する .js スクリプトを呼び出します。サンプル・アプリケーションは、XSL 変換ファイルと XML データ、そして Saxon-CE の JavaScript を呼び出して変換を実行する HTML ファイルで構成されています。私が作成した CDA ビューアー・アプリケーションも同じパターンに従っていますが、私は読みやすいように変換レイヤーを 3 つのファイルに分割しました (「ダウンロード」を参照)。Web サーバーには、各サンプル・アプリケーションに対して 1 つのフォルダーがあり、私が作成した CDA アプリケーションに対しても 1 つのフォルダーがあります。
XSLT 2.0
仕様には数多くの機能が導入されており、例えば関数定義、複数の結果文書、シーケンスとテンポラリー・ツリー、強い型付け、テキスト構文解析などが導入されています。この記事では複数の結果文書を扱える機能に焦点を絞ります。サーバー・サイドでは、複数の結果文書を使用すると複数の文書がサーバー上に作成されます。そのため、いくつかの結果ページを参照する
XHTML
のホーム・ページを作成すると、すべての結果ページはサーバー上に生成されます。サーバー・サイドで変換を行う場合、複数の結果文書を使用すると、文字どおり複数の文書を変換することになります。リスト 2 は、この方法を示しています。Saxon-CE を使用してクライアント・サイドで複数の文書を生成する場合には、生成される内容の対象となるのは、実際にクライアント・アプリケーションの中にあるさまざまな画面領域 (通常は HTML ページの div 要素) です。
リスト 2. サーバー上に複数の結果文書がある場合
<xsl:for-each select="section">
<xsl:result-document href="{@id}.html">
<xsl:apply-templates select="." mode="html" />
</xsl:result-document>
</xsl:for-each>
|
ここでは を以下の 3 つのファイルに分割して構成しました (「ダウンロード」を参照)。
- cda.xsl: 人間が読める文書を表示するための基本的な変換を含んでいます。
- cda-machine-readable.xsl: カスタマイズ可能なレイヤーを含み、このレイヤーにより、コンピューターで読み取り可能な文書の詳細部分が見やすい形で表示されます。
- cda-dom-interaction.xsl: HTML ページの DOM とのやり取り (クリック・イベントなど) を処理するテンプレートを含んでいます。
これらに加え、CSS ファイルと HTML ページ本体もあります。
CSS は単純です。HTML ページも同じように単純であり、CDA ビューアーのさまざまな画面領域に対する div 要素をいくつも含んでいます。各 div 要素は CSS の中にある ID に従って配置されます。この記事では、CDA 全体をロードして変換し、DOM を使用してその
CDA にインタラクティブにアクセスできるようにするつもりです。そこで、ビューアーの一番下に隠していた div-cache という div 要素を使用します。このキャッシュには、CDA
に記録された各エントリーのコピーが含まれています。このキャッシュに含まれているテキストは、画面を下にスクロールすると表示されるようにすることも、この要素に style="visibility:hidden;inline:none" と指定して非表示にすることもできます。
リスト 3 のコードによって変換プロセスがトリガーされます。リスト 3 を見るとわかるように、<script> タグによって最初に Saxon-CE の JavaScript を呼び出し、次に CDA 文書をターゲットとする XSL 変換のスタイルシートを呼び出しています。
リスト 3. HTML ページから Saxon-CE を呼び出す
<script type="text/javascript" language="javascript" src="../Saxonce.nocache.js"></script>
<script type="application/xslt+xml" language="xslt2.0" src="cda.xsl"
input="SampleCDADocument.xml"></script>
|
リスト 3 では、メインの変換によって、まず CDA ラッパーから情報を抽出することで CDA
ビューアー用に単純化されたヘッダーを作成しています。皆さんは既に、xsl:result-document が実際に使われているのを見ました。下記リスト 4 では、<div> タグが #creation ID
の対象になっていることに注意してください。method="ixsl:replace-content"
は、Saxon-CE による「in the interactive XSL, replace the content (対話型の XSL
では、内容を置き換える)」の省略形を表しています。この後すぐに、内容を追加する例を紹介します。CDA を直接操作する場合、その CDA の要素を参照する際には必ず hl7: という名前空間を使用する必要があることに注意してください。後ほど、DOM を参照するテンプレートを扱う際には hl7: 名前空間を使用する必要はないことを説明します。このプロセスは混乱しやすく、テンプレートをいくつかの XML スタイルシートに分割した理由の 1 つは、このプロセスのためです。
リスト 4. xsl:result-document を使用して内容を置き換える
<xsl:result-document href="#creation" method="ixsl:replace-content">
<div>
<xsl:value-of>
<xsl:value-of select="hl7:ClinicalDocument/hl7:title"/>:
<xsl:value-of
select="hl7:ClinicalDocument/hl7:recordTarget/hl7:patientRole/hl7:patient"/>
</xsl:value-of>
</div>
</xsl:result-document>
|
これと同じ XSL ファイルのコードである下記リスト 5 のコードでは、CDA 文書のセクションから CDA
ビューアーの目次が生成される様子がわかるはずです。目次の書式がどのように設定されるかについての詳細は、この記事のサンプル・ファイルを見てください。これと同じような方法で、CDA
から医療情報のエントリー・データがキャッシュに入れられます。どちらの場合にもテンプレートが適用されるたびに、対象になっている <div> 要素の既存の内容に、結果が追加される様子がわかるはずです。
リスト 5. xsl:result-document を使用して内容を追加する
<xsl:result-document href="#notes" method="ixsl:append-content">
<xsl:apply-templates select="//hl7:component/hl7:section" mode="notes"/>
</xsl:result-document>
<xsl:result-document href="#div-cache" method="ixsl:append-content">
<xsl:apply-templates select="//hl7:component/hl7:section" mode="cache"/>
</xsl:result-document>
|
図 1 は基本的な CDA ビューアーと目次を示しています。
図 1. CDA ビューアーの目次
生成された ID を使用して、キャッシュに入れられた CDA エントリーに目次のリンクを接続します。リスト 6 は、目次の中にエントリーを作成するために使用したテンプレートから抜粋したものです。
リスト 6. キャッシュされた CDA エントリーにリンクする
<a class="notes-section">
<xsl:attribute name="id"><xsl:value-of select="generate-id(.)"/></xsl:attribute>
<xsl:value-of select="hl7:title"/>
</a>
|
リスト 7では、このテンプレートを適用してクリック・イベントを処理するように Saxon-CE に指示するために、テンプレートで
mode="ixsl:onclick"
属性を使用していることに注意してください。これは、他の JavaScript によるクリック・イベントを処理する場合と何も変わらず、単に Saxon-CE と XSL
スタイルシートによってクリック・イベントを処理しているにすぎません。このようなクリック・イベントをパーサーが処理すると、必ずコンテキストが元の XML 文書から HTML
ページの DOM に移ることに注意してください。そのために、これらのテンプレートを cda-dom-interaction.xsl
という変換スタイルシートとして分離したのです。このテンプレート自体は CDA エントリーのテキストを表示します。このテキストは、元のクリック・イベントと関連付けられた ID
(元のアンカー・リンクの ID) を使用して先ほど作成したキャッシュから抽出されます。note-detail
結果文書の div 要素の内容はこのテキストで置き換えられます。そしてこのテンプレートは、この後にある適用可能なすべてのテンプレートを適用し、コンピューターで読み取り可能な CDA エントリーの内容の処理を行います。
リスト 7. 目次のクリック・イベントを処理する
<xsl:template match="a[@class='notes-section']" mode="ixsl:onclick">
<xsl:variable name="div-id" select="@id"/>
<xsl:variable name="selected-section"
select="//div[@id='div-cache']/div[@id=$div-id]/section"/>
<xsl:result-document href="#note-detail" method="ixsl:replace-content">
<h2><xsl:value-of select="$selected-section/title/text()"/>
(<xsl:value-of select="$div-id"/>)</h2>
<div><xsl:value-of select="$selected-section/text"/></div>
<h2>Machine-readable Content</h2>
<xsl:apply-templates select="$selected-section" mode="mach-read">
<xsl:with-param name="a" select="."/>
</xsl:apply-templates>
</xsl:result-document>
</xsl:template>
|
コンピューターで読み取り可能な関心事と、人間が読むことのできる関心事が分離された状態を保つために、ここでは cda-machine-readable.xsl という第 3 の変換スタイルシートを作成し、サンプル・ファイルに含めました。これらのテンプレートを別々にしておけば、この第 3 のスタイルシートを拡張したり、もっと高度なスタイルシートに完全に置き換えたりすることで、コンピューターで読み取り可能な CDA 内の情報を処理することができるというメリットがあります。例えば、意匠を凝らした表を用意したり、データをグラフィカルに表現したり、特定のタイプのエントリーを非表示にしたりするために、テンプレートを別々にしておくとよいかもしれません。あるいは深く掘り下げ、例えばメタデータ・リポジトリーから別の XML 文書をロードし、コンピューターで読み取り可能なデータ内のコードを詳しく調べたり、共通のコード体系を使用してカテゴリー分けしたりしてもよいかもしれません。一般に関心の分離が適切なプログラミング・プラクティスであるのと同様に、コンピューターで読み取り可能なエントリーを変換するためのテンプレートを持つことも適切なプログラミング・プラクティスです。大規模な変換や、大規模になることが予想される変換を扱う場合には、このプラクティスは不可欠であると私は思っています。
コンピューターで読み取り可能な変換スタイルシートのなかでも私が使用している最小限のものには、既知のエントリー・タイプ (Observation、Substance
Administration、Procedure、Act などのイベント) を識別し、箇条書きリストと表を使用してスタイルを設定するテンプレートが 1
つだけ含まれています。ここでは何も特別なことを試みたわけではありませんが、単純なテンプレートを使用することでスタイル設定や構成の面で非常に大きな見返りが得られる様子を確認することは、有益な演習となります。またリスト 8
ではパラメーターを使用して、リンクの起点となるアンカー・リンクをテンプレートに渡していることにも注意してください。このステップはコンピューターで読み取り可能なデータを表示する上で必要なわけではありません。むしろ、アンカー・リンクはこのテンプレートを介して渡され、後で使用できるように、エントリーの詳細の最後にある非表示の
div 要素にキャッシュされます。このリンク情報は、後ほど、私が「pin area
(ピン・エリア)」と呼んでいるものを作成するために使用されます。ここでは簡単にするために、xsl:choose
の中にある要素のうち、Observation に対する xsl:when 以外をすべて省略しました。
リスト 8. コンピューターで読み取り可能な CDA エントリーをテンプレート化する
<xsl:template match="section" mode="mach-read">
<xsl:param name="a"/>
<div id="mach-read">
<xsl:choose>
<xsl:when test="entry/observation">
<h3>Observations</h3>
<ul>
<xsl:for-each select="entry/observation">
<li><a>
<xsl:value-of select="text"/>
<xsl:value-of select="code/@displayName"/>
<xsl:for-each select="value">
(<xsl:value-of><xsl:value-of select="@value"/>
<xsl:value-of select="@unit"/></xsl:value-of>)
</xsl:for-each>
</a></li>
</xsl:for-each>
</ul>
</xsl:when>
<xsl:otherwise>(no match)</xsl:otherwise>
</xsl:choose>
<div class="xref" style="visibility:hidden;inline:none">
<xsl:copy-of select="$a"/>
</div>
</div>
</xsl:template>
|
このテンプレートは DOM にキャッシュされた、元の CDA データのコピーに適用されるため、entry、 code、observation などの要素には、hl7: は必要ないことに注意してください。お望みであれば、キャッシュされた CDA エントリーに hl7: 名前空間を追加することもできますが、追加してもさらにシリアライズが実行されるわけではないため、ほとんどメリットはありません。ページ上で HL7 の CDA 要素と他の要素との間に曖昧な部分がある場合には、hl7: 名前空間を追加した方が現実的です。
図 2 はアレルギーと副作用を表す Observation イベントを表示した CDA ビューアーを示しています。
図 2. Observation イベント (アレルギーや副作用など)
ピン・エリアは、これらの変換を作成している間に私の頭に浮かんだデザイン・パターンであり、Saxon-CE での XSLT 2.0 結果文書の実装方法に着想を得たものです。先ほど説明したとおり、生成された内容を画面領域に追加することも、既存の内容と置き換えることもできます。通常は既存の内容と置き換えるのでしょうが、テンプレートを繰り返し適用している場合には内容を追加したい場合もあります。対象とする同じ画面領域に複数のテンプレートを適用する場合には、ブックマークに似た集合を作成することができます。つまり、画面領域の既存の内容を削除することなく、この集合にインタラクティブな方法で時間をかけて内容を追加することができます。
リスト 9 のサンプル・コードでは、ピン・アンカー・リンクに対するテンプレートを見てください。これは確かにサンプル・アプリケーションですが、この発想は興味をそそります。ビューアーに表示された目次のリンクをクリックすると、そのクリック・イベントの処理として、CDA のそのセクションの内容が表示されます。しかし他のリンクをクリックした場合には、そのリンク・イベントは単純なアンカー・テンプレートによって処理され、そのリンクの内容がピン・エリアにコピーされます。その結果、ビューアーを使用して医療文書の内容をふるい分け、後で参照できるようにエントリーを「ピン止め」しておくことができます。
リスト 9. ピン・エリアをテンプレート化する
<xsl:template match="a" mode="ixsl:onclick">
<xsl:variable name="div-mach-read" select="ancestor::div[@id='mach-read']"/>
<xsl:result-document href="#pin" method="ixsl:append-content">
<div>
<xsl:attribute name="title"><xsl:value-of select="$div-mach-read/h3"/>
- <xsl:value-of select="text()"/></xsl:attribute>
<xsl:copy-of select="$div-mach-read/div[@class='xref']/a"/> -
<xsl:value-of select="text()"/>
</div>
</xsl:result-document>
</xsl:template>
|
図 3 はピン・エリアの使い方を示しています。
図 3. CDA ビューアーのピン・エリア
当然のことですが、ピン・エリアのエントリーに対して何らかの有用な操作をできるとしたら、このデザイン・パターンのメリットが大きくなります。しかしこの点については、この記事では説明しません。ピン・エリアの使い方として、E メール・ブラウザーへのプラグインとして使用することが考えられます。そのプラグインにより、患者は自分の担当医から受信した CDA を見ることや、エントリーをピン止めし、それらのエントリーを返信の E メールに含めることができます。このようなアプリケーションを作成する上で、宣言型で情報を処理する Saxon-CE と XSLT 2.0 が役立つツールとなることは間違いありません。
CDA 文書は永続的に記録されるため、多くの場合は非常に大規模なものになりがちです。CDA 文書は人間が読むことを想定していますが、CDA 文書にはコンピューターで読み取り可能な情報も大量に含まれており、拡張したクライアント・ビューに変換すると、それらの情報を扱いやすくなります。Saxon-CE は最近のどのブラウザーでも実行することができ、複数の結果文書をサポートするなど、クライアント・サイドの XSLT 2.0 機能も備えているため、今後リリースされる Saxon-CE は CDA 文書を拡張したクライアント・ビューに変換するための必須ツールになると思います。リッチな医療アプリケーションを開発する上で、この技術が必須になると私は確信しています。
| 内容 | ファイル名 | サイズ | ダウンロード形式 |
|---|---|---|---|
| Sample CDA application | cda_sample.zip | 16KB | HTTP |
学ぶために
- 「データ用のXML: XSLT
2.0の紹介」(Kevin Williams 著、developerWorks、2002年7月): XSLT 2.0 の多くの機能とコード・サンプルを紹介しながら、この新しいXMLスタイル言語がどのように効果的に機能するかを解説しています。
- 「Compiling
Saxon using GWT」(Michael Kay 博士著、Saxon diaries、2010年11月): このブログ記事を読み、Google Web Toolkit を使用してどのように Saxon パーサーを Java から JavaScript にポーティングしたのかを学んでください。
- HL7 Clinical Document
Architecture: HL7 CDA について、Journal of the American Medical Informatics Association のサイトで学んでください。
- HL7
version 3: Message or CDA Document?: この Ringholm による有益な記事で、HL7 V3 のメッセージングと CDA との違いについて学んでください。
- 著者の
Piers Michael Hollott が developerWorks に寄稿した他の記事 (2010年11月から現在まで): DITA その他の技術に関する記事を読んでください。
- New to XML には、XML を学ぶために必要なリソースが豊富に用意されています。
- developerWorks の XML ゾーン:
DTD、スキーマ、XSLT など、XML の領域でのスキルを磨くためのリソースが豊富に用意されています。XML の技術文書一覧には、広範な話題を網羅した技術記事やヒント、チュートリアル、技術標準、IBM Redbooks が豊富に用意されています。
- IBM XML certification: XML および関連技術において IBM 認定技術者になる方法を参照してください。
- developerWorks の Technical events and
webcasts: これらのセッションで最新情報を入手してください。
- developerWorks on Twitter: 今すぐ Twitter に参加して
developerWorks のツイートをフォローしてください。
- developerWorks podcasts: ソフトウェア開発者のための興味深いインタビューや議論を聞いてください。
- developerWorks on-demand
demos: 初心者のための製品インストール方法やセットアップのデモから、上級開発者のための高度な機能に至るまで、多様な話題が解説されています。
製品や技術を入手するために
- Saxon-CE: Saxonica Web サイトからアルファ・リリースをダウンロードしてください。またサンプル・アプリケーションやドキュメントもダウンロードすることができます。
- XML Prague
2011 (PDF ファイル): カンファレンスの議事録をダウンロードしてください。
- IBM 製品の評価版: IBM
製品の評価版をダウンロードするか、あるいは IBM SOA Sandbox のオンライン試用版で、DB2、Lotus、Rational、Tivoli、および WebSphere が提供するアプリケーション開発ツールやミドルウェア製品を試してみてください。
議論するために
- XML
ゾーンのディスカッション・フォーラム: これらのフォーラムでは XML に関連する議論が行われています。
- developerWorks コミュニティー: 開発者向けのブログ、フォーラム、グループ、ウィキなどを利用しながら、他の developerWorks ユーザーとやり取りしてください。