Saxon-CE と HL7 CDA を使用してクライアント・サイドのヘルスケア・アプリケーションを実装する

ブラウザーで XSLT 2.0 を使用し、医療文書の表示を強化する

XML Prague 2011 カンファレンスにおいて、Saxon XSL/XQuery パーサーの中心的開発者、Michael Kay 博士が Saxon-CE を発表しました。Saxon-CE は JavaScript を使用して Web ブラウザーで実行するクライアント・サイドの XSLT 2.0 パーサーです。この記事では、HL7 CDA (Health Level 7 Clinical Document Architecture) を使用して作成された医療文書を基に動作する単純な医療アプリケーションのビューを、XSLT 2.0 と Saxon-CE を使用して作成する方法を説明します。

Piers Michael Hollott, Senior Consultant, Sierra Systems

Piers Hollott はソフトウェア業界で 15 年間働いており、Java 開発、XML 技術、関数型プログラミングを専門としています。彼はいくつかのオープンソース・プロジェクトに貢献した経験があり、現在は Sierra Systems のコンサルタントをしています。



2011年 10月 21日

よく使われる頭文字語

  • CSS: Cascading StyleSheet
  • DOM: Document Object Model
  • HTML: HyperText Markup Language
  • URL: Uniform Resource Locator
  • XHTML: Extensible HTML
  • XML: Extensible Markup Language
  • XSL: Extensible Stylesheet Language
  • XSLT: Extensible Stylesheet Language Transformation

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 をダウンロードする

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 の機能を調べる

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>

CDA ビューアーの目次を表示する

リスト 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 ビューアーの目次
CDA ビューアーの目次のスクリーン・キャプチャー

DOM を操作する

生成された 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 データのコピーに適用されるため、entrycodeobservation などの要素には、hl7: は必要ないことに注意してください。お望みであれば、キャッシュされた CDA エントリーに hl7: 名前空間を追加することもできますが、追加してもさらにシリアライズが実行されるわけではないため、ほとんどメリットはありません。ページ上で HL7 の CDA 要素と他の要素との間に曖昧な部分がある場合には、hl7: 名前空間を追加した方が現実的です。

図 2 はアレルギーと副作用を表す Observation イベントを表示した CDA ビューアーを示しています。

図 2. Observation イベント (アレルギーや副作用など)
アレルギーや副作用などの Observation イベントを表示した CDA ビューアーのスクリーン・キャプチャー

新しいデザイン・パターンを作成する: ピン・エリア

ピン・エリアは、これらの変換を作成している間に私の頭に浮かんだデザイン・パターンであり、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 ビューアーのピン・エリア
CDA ビューアーのピン・エリアのスクリーン・キャプチャーが表示されており、いくつかの項目がピン・エリアに書き留められています。

当然のことですが、ピン・エリアのエントリーに対して何らかの有用な操作をできるとしたら、このデザイン・パターンのメリットが大きくなります。しかしこの点については、この記事では説明しません。ピン・エリアの使い方として、E メール・ブラウザーへのプラグインとして使用することが考えられます。そのプラグインにより、患者は自分の担当医から受信した CDA を見ることや、エントリーをピン止めし、それらのエントリーを返信の E メールに含めることができます。このようなアプリケーションを作成する上で、宣言型で情報を処理する Saxon-CE と XSLT 2.0 が役立つツールとなることは間違いありません。


まとめ

CDA 文書は永続的に記録されるため、多くの場合は非常に大規模なものになりがちです。CDA 文書は人間が読むことを想定していますが、CDA 文書にはコンピューターで読み取り可能な情報も大量に含まれており、拡張したクライアント・ビューに変換すると、それらの情報を扱いやすくなります。Saxon-CE は最近のどのブラウザーでも実行することができ、複数の結果文書をサポートするなど、クライアント・サイドの XSLT 2.0 機能も備えているため、今後リリースされる Saxon-CE は CDA 文書を拡張したクライアント・ビューに変換するための必須ツールになると思います。リッチな医療アプリケーションを開発する上で、この技術が必須になると私は確信しています。


ダウンロード

内容ファイル名サイズ
Sample CDA applicationcda_sample.zip16KB

参考文献

学ぶために

製品や技術を入手するために

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=XML, Industries
ArticleID=765699
ArticleTitle=Saxon-CE と HL7 CDA を使用してクライアント・サイドのヘルスケア・アプリケーションを実装する
publish-date=10212011