rbeckman-nextgen / test-mc6

0 stars 0 forks source link

Add option in HL7 Data type screen to "Substitute/escape separators" #4073

Open rbeckman-nextgen opened 4 years ago

rbeckman-nextgen commented 4 years ago

When transforming a HL7 v2 message to the Mirth XML format, escaped separator characters in the HL7 source message are not "un-escaped" in the XML representation...

Example:

OBX|1|RP|EXAM^Exam^L||\E\E\servername\E\share$\E\folder\E\filename.PDF||||||F|||20171011121100

-> the \E\ should be translated in the XML messages as a simple \ (depending on the escape characters defined/used in MSH-1 of the source HL7 message)

cfr HL7 v2 - Chapter 2 - Control

/ escape the field separator / substitute( field_separator, \F\ ); / escape the encoding characters / substitute( component_separator, \S\ ); substitute( repetition_separator, \R\ ); substitute( escape_character, \E\ ); substitute( subcomponent_separator, \T\ ); substitute (truncation_character, \P\ ) /See 2.7.2Truncation Character escape/

Imported Issue. Original Details: Jira Issue Key: MIRTH-4221 Reporter: nico Created: 2017-10-11T03:13:15.000-0700

rbeckman-nextgen commented 4 years ago

FYI - Example code templates that perform the (un)escaping

/** Unescape HL7 message - unescape characters (separators) in the message content Use in your first transformer step ! Usage: be_amaron_hl7_escape_unescapeHL7(msg);

@param {Any} xmlMessage - 

/ function be_amaron_hl7_escape_unescapeHL7(xmlHL7Message) { if ((typeof xmlHL7Message === "xml") && (xmlHL7Message.localName() == "HL7Message")) { function replaceEscapedChars(xmlNode) { if (xmlNode.hasSimpleContent()) { var javaTextContent = new java.lang.String(xmlNode.text()); javaTextContent = javaTextContent.replace(escapeChar + "F" + escapeChar, fieldSep); javaTextContent = javaTextContent.replace(escapeChar + "S" + escapeChar, componentSep); javaTextContent = javaTextContent.replace(escapeChar + "T" + escapeChar, subComponentSep); javaTextContent = javaTextContent.replace(escapeChar + "R" + escapeChar, repetitionSep); javaTextContent = javaTextContent.replace(escapeChar + "E" + escapeChar, escapeChar); javaTextContent = javaTextContent.replace(escapeChar + "P" + escapeChar, truncationChar); xmlNode. = javaTextContent; } else { if (xmlNode.hasComplexContent()) { for each (child in xmlNode.children()) { replaceEscapedChars(child); }
} } }

    // replace escaped HL7 separator characters
    var fieldSep = xmlHL7Message['MSH']['MSH.1'].toString();
    var encodingChars = new java.lang.String(xmlHL7Message['MSH']['MSH.2'].toString());
    var componentSep = encodingChars.substring(0, 1);
    var repetitionSep = encodingChars.substring(1, 2);
    var escapeChar = encodingChars.substring(2, 3);
    var subComponentSep = encodingChars.substring(3, 4);
    var truncationChar = "#";
    if (encodingChars.length() > 4)
    {
        truncationChar = encodingChars.substring(4, 5);
    }

    for each (child in xmlHL7Message.children()) {
        replaceEscapedChars(child);
    }

}
else
{
    throw "Invalid object type for method be_amaron_hl7_escape_unescapeHL7: " + xmlHL7Message;
}

}

/** Escape HL7 message - escape characters (separators) in the message content Use in your last transformer step ! Usage: be_amaron_hl7_escape_escapeHL7(msg);

@param {Any} xmlMessage - 

/ function be_amaron_hl7_escape_escapeHL7(xmlHL7Message) { if ((typeof xmlHL7Message === "xml") && (xmlHL7Message.localName() == "HL7Message")) { function replaceCharsToEscape(xmlNode) { if ((xmlNode.hasSimpleContent()) && (xmlNode.localName() != "MSH.1") && (xmlNode.localName() != "MSH.2")) { var javaTextContent = new java.lang.String(xmlNode.text()); javaTextContent = javaTextContent.replace(escapeChar, escapeChar + "E" + escapeChar); javaTextContent = javaTextContent.replace(fieldSep, escapeChar + "F" + escapeChar); javaTextContent = javaTextContent.replace(componentSep, escapeChar + "S" + escapeChar); javaTextContent = javaTextContent.replace(subComponentSep, escapeChar + "T" + escapeChar); javaTextContent = javaTextContent.replace(repetitionSep, escapeChar + "R" + escapeChar);
javaTextContent = javaTextContent.replace(truncationChar, escapeChar + "P" + escapeChar); xmlNode.
= javaTextContent; } else { if (xmlNode.hasComplexContent()) { for each (child in xmlNode.children()) { replaceCharsToEscape(child); }
} } }

    // replace escaped HL7 separator characters
    var fieldSep = xmlHL7Message['MSH']['MSH.1'].toString();
    var encodingChars = new java.lang.String(xmlHL7Message['MSH']['MSH.2'].toString());
    var componentSep = encodingChars.substring(0, 1);
    var repetitionSep = encodingChars.substring(1, 2);
    var escapeChar = encodingChars.substring(2, 3);
    var subComponentSep = encodingChars.substring(3, 4);
    var truncationChar = "#";
    if (encodingChars.length() > 4)
    {
        truncationChar = encodingChars.substring(4, 5);
    }

    for each (child in xmlHL7Message.children()) {
        replaceCharsToEscape(child);
    }

}
else
{
    throw "Invalid object type for method be_amaron_hl7_escape_escapeHL7: " + xmlHL7Message;
}

}

Imported Comment. Original Details: Author: nico Created: 2017-10-11T06:40:09.000-0700