saxon 使用
Health Level 7(HL7)临床文档体系结构(CDA)基于用于开发HL7 v3消息交互的HL7版本3参考信息模型。 HL7消息传递表示各个医疗保健交互(例如查询,响应和通知),而HL7 CDA文档是表示患者就诊的单个持久性文档,护理连续性文档等。 为了使CDA中的条目可被人们阅读,除了任何机器可读的内容之外,每个条目还具有文本描述,如清单1所示 。 严格来说,HL7 v3消息旨在通过有线传输(例如,作为客户端-服务器交互或服务器-服务器数据分发的一部分); 由于HL7 CDA文档也旨在提高人类可读性,因此可以通过其他方式(例如电子邮件)进行传输。
清单1. CDA中的一个观察条目:青霉素过敏
<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转换已有几年了。 最近,在2011 XML Prague会议上,撰写原始Saxon解析器的Michael Kay博士介绍了Saxon Client Edition(Saxon-CE)的Alpha版本,该版本允许直接从Web客户端应用程序运行XSLT 2.0转换(在浏览器中)。 Saxon-CE使用JavaScript可以在任何现代浏览器上运行,这在客户端XSL上一直是一个问题:从历史上看,不同浏览器并没有始终如一地实现XSL支持。 因为它使用JavaScript作为运行时引擎,所以Saxon-CE解决了此问题。
另外,XSLT 2.0提供了原始XSLT 1.0规范不支持的若干功能,例如,支持多个文档和更强的数据键入。 借助Saxon-CE,客户端现在支持这些功能,并且如本文所示,其中某些功能非常适合在客户端应用程序视图中使用-特别是客户端对多个文档的支持。
入门
为了开发本文所述的CDA Viewer应用程序,我使用了最新Opera版本附带的Unite Web服务器。 您可以使用自己喜欢的任何应用程序服务器。 因为我描述的是如何开发客户端应用程序视图,所以我没有描述CDA文档是如何持久或分发的。 为了测试我的应用程序视图,我只是直接通过Web服务器将样本CDA作为URL发布(或者,您可以将它们持久保存在XML数据库中,例如IBM®DB2®pureXML)。 同样,我的XSL转换以URL的形式发布。
下载Saxon-CE
Saxon-CE alpha版本当前可从Saxonica网站下载。 目前,此Alpha版本不适用于生产应用程序。 但是,基于原始的Saxon解析器的成功,我毫不怀疑客户端版本也将很快成为行业标准,尤其是当它得到早期采用者的积极反馈时。
alpha版本附带全面的发行说明。 您可以像其他任何.js脚本一样,将解压缩后的release文件夹中包含JavaScript文件复制到应用程序服务器。 您还应该花一些时间下载示例应用程序。 JavaScript由单个.nocache.js文件以及许多缩小的.js文件组成-每个主要浏览器都包含一个。 这些文件包含实际的解析器代码。 .nocache.js文件检测到正在使用哪个浏览器,然后调出相应的.js脚本。 示例应用程序包括一个XSL转换文件,一些XML数据和一个HTML文件,该文件调用Saxon-CE JavaScript来运行转换。 我构建的CDA Viewer应用程序遵循相同的模式,尽管我将转换层分为三个文件以提高可读性(请参阅下载 )。 在我的Web服务器上,每个示例应用程序都有一个文件夹,而CDA应用程序则有一个文件夹。
探索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>
转变临床文件
我将XSL转换组织成三个文件(请参阅下载 ):
- cda.xsl。 包含显示人类可读文档的基本转换
- cda机器可读.xsl。 包含一个可自定义的层,该层当前以整齐的方式显示文档的机器可读详细信息
- cda-dom-interaction.xsl。 包含处理与HTML页面DOM交互的模板,例如单击事件
此外,还有一个CSS文件和HTML页面本身。
CSS很简单。 HTML页面同样简单明了,包含用于CDA Viewer的不同屏幕区域的许多div
元素,每个元素都可以通过CSS中的ID进行定位。 我的计划是加载整个CDA并对其进行转换,然后允许通过DOM进行交互式访问,这样我就有了一个名为div-cache
的div
元素,该元素已隐藏在查看器的底部。 该缓存包含CDA中记录的每个条目的副本。 您可以向下滚动并查看此文本,也可以通过将其标记为style="visibility:hidden;inline:none"
使其style="visibility:hidden;inline:none"
。
清单3中的代码触发了转换过程。 如您所见, <script>
标记首先调用Saxon-CE JavaScript,然后调用XSL转换样式表,以CDA文档为目标。
清单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 Viewer的目录
在清单3中 ,主要转换首先通过从CDA包装器中提取一些信息来为CDA Viewer创建一个简化的标头。 您已经可以看到xsl:result-document
使用。 在清单4中 ,注意<div>
标记的#creation
ID是如何定位的。 method="ixsl:replace-content"
是Saxon-CE的缩写,表示“在交互式XSL中替换内容”。 稍后将添加内容,您将看到一个示例。 请注意,当您直接处理CDA时,无论何时引用CDA中的元素,都需要使用hl7:
名称空间。 稍后您将看到在处理引用DOM的模板时这不是必需的。 这个过程可能很棘手,这也是我将模板分成几个XSL样式表的原因之一。
清单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 Viewer的目录。 查看提供的样本文件,以详细了解目录的格式。 使用类似的方法来缓存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 Viewer和目录。
图1. CDA Viewer目录
![CDA View应用程序目录的屏幕截图](https://i-blog.csdnimg.cn/blog_migrate/fff79a204bc53a27f81e754750d3da57.png)
与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中 ,请注意模板上的mode="ixsl:onclick"
属性如何用于告诉Saxon-CE应用此模板来处理click事件。 这与任何其他JavaScript click事件没有什么不同:它可以简单地由Saxon-CE和XSL样式表处理。 请注意,每当解析器处理这样的click事件时,上下文就会从原始XML文档转移到HTML页面的DOM,这就是为什么我将这些模板分离成名为cda-dom-interaction.xsl的转换样式表的原因。 模板本身显示CDA条目的文本,该CDA条目的文本是使用与原始click事件关联的ID(原始锚链接的ID)从先前创建的缓存中提取的。 该文本替换了note-detail
结果文档div element
。 然后,该模板将应用任何适用的下游模板来处理CDA条目中的机器可读内容。
清单7.处理目录中的click事件
<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-sensitive.xsl。 将这些模板保持分开的优势在于,可以扩展或完全替换此第三样式表,以使用更复杂的样式表来处理CDA中的机器可读信息。 例如,您可能想要这样做,以提供更高级的表或数据的图形表示或保留某些类型的条目。 另外,您可能想深入研究并从元数据存储库中加载另一个XML文档,并扩展机器可读数据中的某些代码,或者使用通用代码系统对它们进行分类。 保留用于转换机器可读条目的模板是一种良好的编程习惯,通常也是如此。 我发现这种做法在处理大规模转型或我期望增长的转型时至关重要。
显示机器可读的临床条目
我的极简机器可读转换样式表包含一个模板,该模板标识许多已知的条目类型(“观察”,“物质管理”,“过程”和“行为”事件),并使用项目符号列表和表格对它们进行样式设置。 在这里,我没有做过任何花哨的尝试,但是查看一个简单的模板如何在样式和组织上带来实质性的回报是一个有用的练习。 还请注意在清单8中如何使用参数将原始锚链接传递到模板。 显示机器可读数据不需要此步骤; 而是将链接通过此模板传递并缓存,以供以后在条目详细信息底部的隐藏div
元素中使用。 此链接信息随后将用于构建我所说的引脚区域 。 为了简洁起见,我在xsl:choose
省略了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数据的副本hl7:
不需要相同的元素entry
, code
和observation
。 如果需要,可以将此名称空间添加到缓存的CDA条目,但是这样做没有什么好处,因为不会执行进一步的序列化。 如果HL7 CDA元素与页面上的其他元素之间存在歧义,那么这样做将是实用的。
图2显示了CDA Viewer,它显示了代表过敏和不良React的观察事件。
图2.观察事件,例如过敏和不良React
开发新的设计模式:引脚区域
引脚区域是在这些转换的开发过程中出现的一种设计模式,其灵感来自于Saxon-CE实现XSLT 2.0结果文档的方式。 如前所述,生成的内容可以附加到屏幕区域,也可以替换现有内容。 通常,您将要替换现有内容; 但是,当您重复应用模板时,您想要附加内容。 如果将多个模板应用于同一目标屏幕区域,则可以创建类似于书签的集合:您可以随时间交互地添加到此集合,而无需删除屏幕区域中的任何现有内容。
在清单9的示例代码中,查看固定定位链接的模板。 当然,这是一个示例应用程序,但是这里的想法很有趣。 当您单击查看器目录中的链接时,通过显示CDA该部分的内容来处理click事件。 但是,当您单击任何其他链接时,一个简单的锚模板将处理该链接事件,并将链接的内容复制到图钉区域。 结果是您可以使用Viewer筛选临床文档的内容和“固定”条目以供以后参考。
清单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 Viewer的引脚区域
![CDA Viewer的图钉区域的屏幕截图,其中记录了其中的项目](https://i-blog.csdnimg.cn/blog_migrate/ed610846bf2811cbeb6d9778c83d7bf5.png)
如果您可以对固定的条目做一些有用的事情,那么这种设计模式的好处当然会增加。 但是,该讨论超出了本文的范围。 一个潜在的用例可能涉及到电子邮件浏览器的插件,该插件使患者可以查看从其从业者那里收到的CDA,固定一些条目,然后将其包含在电子邮件响应中。 由于它们以声明方式处理信息的方式,Saxon-CE和XSLT 2.0无疑将被证明是开发这些应用程序的有用工具。
结论
CDA文档是永久性的,因此通常非常大。 尽管CDA文档旨在让人们阅读,但它们也包含大量机器可读信息,可以通过转换为扩展的客户视图来使其更易于管理。 我确信,在将来的发行版中,Saxon-CE将被证明是执行此操作的必要工具,因为它可以在任何现代浏览器上运行,并且提供了客户端XSLT 2.0功能,例如对多结果文档的支持。 我完全希望这项技术对于丰富的医疗保健应用程序的开发人员而言必不可少。
翻译自: https://www.ibm.com/developerworks/xml/library/x-healthcaresaxon/index.html
saxon 使用