0

所以我有这个 hl7 类型的消息,我必须使用正则表达式或 xslt 或两者的组合进行转换。

此消息的格式是DateTime(as in 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>

那么我将如何解决这个问题?提前致谢。

4

2 回答 2

0

鉴于您的 Hl7 消息是“|^~\&”编码的而不是 XML 格式,因此不清楚您将如何使用 XSLT 1.0 处理器来完成您的任务。您能否更详细地描述您的处理流程?您的片段不是完整的消息,目前尚不清楚您是从完整的消息开始还是尝试解析通过参数或其他东西传递给更大处理任务的孤立字段。

如果您的处理以完整的 HL7 消息开始,我建议您查看HAPI项目或类似的库集,以将消息从 |^~\& 转换为 </> 格式,然后在该版本上调用您的 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>
于 2013-06-15T15:03:29.810 回答
0

您的源消息是字符串形式,您需要创建一个解析器,该解析器使用正则表达式根据第一个管道然后克拉来拆分消息。请参阅无法解析 ^ 字符,该字符具有我的解析器原始代码,并且解决方案提供了不同的方法。

拥有单个元素后,您需要将其作为节点添加到您的 xml 中。

于 2013-06-14T15:35:37.360 回答