Generating a C-CDA Document from an HL7 Message
InterSystems products includes transformations that can accept an HL7 message, transform it into SDA (an internal representation), and then transform it into a C-CDA document. You can then provide and register the C-CDA to an XDS document repository.
HL7 to C-CDA Provide and Register Message Trace
The following diagram is an annotated message trace for an HL7 message transformed into a C-CDA followed by an XDS provide and register. The provide and register includes a PIX search to get the MPI ID from the MRN extracted from the C-CDA.
The test service shown in the diagram is a simple message router. Trace operations is a utility that makes intermediate processing steps visible in the trace. The numbers in the diagram match the steps in the procedure below.
HL7 to C-CDA Provide and Register Procedure
To set up InterSystems products to convert HL7 into C-CDA:
-
Create an HL7 input service (for example, an HL7 file service). Set up the HL7 input service to forward HL7 messages to some operation named in the TargetConfigNames setting.
-
Create the operation named in the previous step, and set it up to:
-
transform the HL7 message into SDA3.
-
transform the SDA into a C-CDA 1.1 or 2.1 document
-
package the C-CDA into a Provide and Register request.
-
send the Provide and Register request to the InterSystems Document Source.
-
-
The Document Source then follows the path laid out in the section Provide and Register a CDA document.
HL7 to C-CDA Provide and Register Components and Settings
Component | Setting |
---|---|
Business Hosts | HL7 Service: EnsLib.HL7.Service.FileServiceOpens in a new tab (or similar) |
Business Hosts | HL7 to C-CDA Transformer: Custom Business Operation |
Business Hosts | Document Source: HS.IHE.XDSb.DocumentSource.OperationsOpens in a new tab |
Business Hosts | PIX Consumer: HS.IHE.PIXv3.Consumer.OperationsOpens in a new tab |
Production Settings | TargetConfigNames in the HL7 Service |
Production Messages | HS.Message.IHE.XDSb.ProvideAndRegisterRequestOpens in a new tab |
Production Messages | HS.Message.XMLMessageOpens in a new tab:
|
Production Messages | HS.Message.PatientSearchRequestOpens in a new tab |
Production Messages | HS.Message.PatientSearchResponseOpens in a new tab |
XSL Transformations | SDA-to-CCDAv21-CCD.xsl or other SDA to C-CDA transformation |
Service Registry Entries | XDSb.Repository |
Service Registry Entries | PIXv3.Manager |
External IHE Actor Endpoints | XDS Document Repository |
External IHE Actor Endpoints | PIX Manager |
Example Transformer Business Operation to Generate a C-CDA Document from an HL7 Message
Below is a sample business operation that accepts an HL7 message and transforms it into a C-CDA document:
Class Test.HL7Transformer Extends (Ens.BusinessOperation)
[ Inheritance = right, ProcedureBlock ]
{
Parameter INVOCATION = "Queue";
/// XDSb source operations component
Property XDSbSourceOperations As Ens.DataType.ConfigName
[ InitialExpression = "HS.IHE.XDSb.DocumentSource.Operations"];
Parameter SETTINGS As %String = "XDSbSourceOperations";
XData MessageMap
{
<MapItems>
<MapItem MessageType="EnsLib.HL7.Message">
<Method>ProcessHL7Message</Method>
</MapItem>
</MapItems>
}
/// Process an inbound HL7 v2.5.1 message
Method ProcessHL7Message(pRequest As EnsLib.HL7.Message,
Output pResponse As EnsLib.HL7.Message) As %Status
{
Try {
// Convert the HL7 message to SDA3
Set tSC = ##class(HS.Gateway.HL7.HL7ToSDA3).GetSDA(pRequest,.tSDA3Stream)
Quit:$$$ISERR(tSC)
// Transform the SDA3 to a C-CDA
Set tTransformer = ##class(HS.Util.XSLTTransformer).%New()
Set tSC= tTransformer.Transform(tSDA3Stream,"SDA3/SDA-to-CCDA-CCD.xsl",.tCDAStream)
Quit:$$$ISERR(tSC)
// Create a Provide and Register
Set tRequest = ##class(HS.Message.IHE.XDSb.ProvideAndRegisterRequest).%New()
Set tDocument = ##class(HS.Message.IHE.XDSb.Document).%New()
Set tDocument.FormatCode=##class(HS.IHE.XDSb.Types.CodedValue).Create(
"urn:hl7-org:sdwg:ccda-structuredBody:1.1","1.3.6.1.4.1.19376.1.2.3",
"Consolidated CDA R1.1 Structured Body Document")
Set tDocument.MimeType="text/xml"
// Copy the C-CDA into the message
Do tDocument.BodyCharacter.CopyFrom(tCDAStream)
Do tRequest.Documents.Insert(tDocument)
// Call the document source operation
Set tSC = ..SendRequestSync(..XDSbSourceOperations,tRequest,.tResponse)
Quit:$$$ISERR(tSC)
} Catch ex {
Set tSC= ex.AsStatus()
}
Quit tSC
}
}