簡體   English   中英

使用xslt或regex或兩者結合處理hl7類型消息(XSLT 1.0)

[英]Processing hl7 type message using xslt or regex, or combination of two (XSLT 1.0)

所以我有這個hl7類型的消息,我必須使用正則表達式或xslt或兩者的組合進行轉換。

該消息的格式為DateTime(如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>

那么我該如何解決呢? 提前致謝。

您的源消息采用字符串形式,您需要創建一個解析器,該解析器使用正則表達式根據第一個管道然后按克拉來拆分消息。 請參閱無法解析^字符 ,該字符具有我的解析器原始代碼,解決方案為此提供了另一種方法。

在擁有各個元素之后,您需要將其作為節點添加到xml中。

假設您的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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM