所以我有这个hl7类型的消息,我必须使用regex或xslt或两者的组合进行转换。
该消息的格式为日期时间(YYYYMMDDHHMMSS)^UnitName^room^bed|)。每个位置都用管道分开,因此每个人可以有一个或多个位置。消息看起来像这样(当患者只有一个位置时):
20130602201605^Some Hospital^ABFG^411|
结束的xml结果应该像这样:
<Location>
<item>
<when>20130602201605</when>
<UnitName>Some Hospital</UnitName>
<room>ABFG</room>
<bed>411</bed>
</item>
</Location>
如果只有一个位置,我可能会使用子字符串类型的函数。我遇到的问题是当多于一个的时候。一般来说,我对xslt和regex比较陌生,所以我不知道如何在这些实例中使用递归。如果我有这样的消息,有多个位置:
20130601003203^GBMC^XXYZ^110|20130602130600^Sanai^ABC^|20130602150003^John Hopkins^J615^A|
最终结果应该是:
<Location>
<item>
<when>0130601003203</when>
<UnitName>GBMC</UnitName>
<room>XXYZ</room>
<bed>110</bed>
</item>
<item>
<when>20130602130600</when>
<UnitName>Sanai</UnitName>
<room>ABC</room>
<bed></bed>
</item>
<item>
<when>20130602150003</when>
<UnitName>John Hopkins</UnitName>
<room>J615</room>
<bed>A</bed>
</item>
</Location>
我怎么解决这个问题呢?
考虑到Hl7消息是"|^~&"编码的,而不是XML格式,因此不清楚如何使用XSLT 1.0处理器来完成任务。你能更详细地描述一下你们的加工流程吗?您的代码片段不是完整的消息,并且不清楚您是从完整的消息开始还是试图解析通过参数或其他方式传递给更大的处理任务的孤立字段。
如果您的处理以完整的HL7消息开始,我建议您查看HAPI项目或类似的库集,以便将消息从|^~&& lt;/比;格式,然后在该版本的数据上调用XSLT。(您也可以在全java解决方案中使用HAPI库。在这两种情况下,在HAPI站点和HL7上的Apache站点上都有代码示例。如果您对使用Java根本不感兴趣,但愿意接受部分非xslt解决方案,还有其他项目提供类似的序列化选项(例如,Perl的Net::HL7, VB/c#的nHAPI等)。
如果您已经在其他XML格式的文件中隔离了"|^~&"编码的数据,那么我建议您查看XSLT 1.0 exslt函数中的str:tokenize函数。(XSLT 2.0有一个内置的标记函数。)您可以让str:tokenize
拆分字段或组件分隔符上的数据,然后使用标记化的子字符串创建元素。
这是一个样式表
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:str="http://exslt.org/strings"
extension-element-prefixes="str"
version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="data">
<Location>
<xsl:for-each select="str:tokenize(.,'|')">
<xsl:call-template name="handle-field">
<xsl:with-param name="field" select="."/>
</xsl:call-template>
</xsl:for-each>
</Location>
</xsl:template>
<xsl:template name="handle-field">
<xsl:param name="field"/>
<xsl:variable name="components" select="str:tokenize($field,'^')"/>
<item>
<when><xsl:value-of select="$components[1]"/></when>
<UnitName><xsl:value-of select="$components[2]"/></UnitName>
<room><xsl:value-of select="$components[3]"/></room>
<bed><xsl:value-of select="$components[4]"/></bed>
</item>
</xsl:template>
</xsl:stylesheet>
在这个输入
上运行的<?xml version="1.0" encoding="UTF-8"?>
<data>20130601003203^GBMC^XXYZ^110|20130602130600^Sanai^ABC^|20130602150003^John Hopkins^J615^A|</data>
使用xsltproc:
生成以下输出<?xml version="1.0"?>
<Location>
<item>
<when>20130601003203</when>
<UnitName>GBMC</UnitName>
<room>XXYZ</room>
<bed>110</bed>
</item>
<item>
<when>20130602130600</when>
<UnitName>Sanai</UnitName>
<room>ABC</room>
<bed/>
</item>
<item>
<when>20130602150003</when>
<UnitName>John Hopkins</UnitName>
<room>J615</room>
<bed>A</bed>
</item>
</Location>
您的源消息是字符串形式的,您需要创建一个解析器,该解析器使用regex根据第一个管道然后是carat分割消息。参考无法解析^字符,其中包含解析器的原始代码,解决方案给出了不同的方法。
有了单独的元素后,需要将它们作为节点添加到xml中。