[英]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>
那么我該如何解決呢? 提前致謝。
假設您的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.