C-CDA on FHIR, published by HL7 International / Cross-Group Projects. This guide is not an authorized publication; it is the continuous build for version 1.2.0 built by the FHIR (HL7® FHIR® Standard) CI Build. This version is based on the current content of https://github.com/HL7/ccda-on-fhir/ and changes regularly. See the Directory of published versions
This page provides a mapping from CDA to FHIR. For the FHIR to CDA mapping, please refer to Medications FHIR → CDA. For guidance on how to read the table below, see Reading the C-CDA ↔ FHIR Mapping Pages
Medications to MedicationRequestMedications shown below represent the moodCode="INT" in CDA. For mapping histories of medication use from CDA, no consensus was established. We welcome feedback on this topic. For more information, please see chat.fhir.org and related stream
Medication Timing and Frequency
C-CDA represents both timing (start date / end date) and frequency (when and how often to take) using <effectiveTime>
elements. The first (represented in XPath as /effectiveTime[1]
) represents the timing. If it contains <low>
and/or <high>
timestamps, this represents the .timing.repeat.boundsPeriod
information of MedicationRequest.dosageInstruction
. If, instead, the first effectiveTime only contains a single @value
attribute, it represents a .timing.event
dateTime value.
The second <effectiveTime>
represents the frequency and contains the attribute @operator="A"
to indicate it is an intersection with the first effectiveTime. It must also have an @xsi:type
attribute which identifies the type of frequency as PIVL_TS
(Periodic Interval) or EIVL_TS
(Episodic Interval). PIVL_TS
is the most common and represents a frequency corresponding to .timing.repeat.frequency
/ .timing.repeat.period
/ .timing.repeat.periodUnit
. These relationship of three fields is described in FHIR: “Event occurs frequency times per period”. For example: “Every 8 hours” would become 1 / 8 / h (one time every eight hours), while “TID” would become 3 / 1 / d (three times every one day).
EIVL_TS
represents an event-based frequency, such as “1 hour after meal”. The CDA <event code="xx">
corresponds to FHIR’s .timing.when
and the optional <offset>
corresponds to .timing.offset
.
The C-CDA Example Search site maintains a document of Common Medication Frequencies which can be cross-referenced with a similar table in FHIR’s Timing Data Type to properly map CDA frequencies to FHIR timing values.
C-CDA¹ Medication Activity substanceAdministration |
FHIR MedicationRequest |
Transform Steps |
---|---|---|
/@negationInd=”true” | set .doNotPerform=true | |
@moodCode | .intent | CDA coding ↔ FHIR CodeableConcept Mood to intent |
/id | .identifier | CDA id ↔ FHIR identifier |
/statusCode | .status | Pay attention to the definitions of active and completed in the FHIR medicationrequest-status code system. C-CDA may list a medication state as “completed” (i.e. the prescription writing has been completed), but containing dates in the future. This may more align with a FHIR status of “active” than “completed” which indicates all actions implied by the prescription have been completed CDA statusCode → FHIR status |
/effectiveTime[1]/@value | .dosageInstruction.timing.event | Constraint: Use this when effectiveTime@value is populated CDA ↔ FHIR Time/Dates |
/effectiveTime[1]/low | .dosageInstruction.timing.repeat.boundsPeriod.start | Constraint: Use this when effectiveTime/@value is not populated CDA ↔ FHIR Time/Dates |
/effectiveTime[1]/high | .dosageInstruction.timing.repeat.boundsPeriod.end | Constraint: Use this when effectiveTime/@value is not populated CDA ↔ FHIR Time/Dates |
Periodic Frequency /effectiveTime[operator=”A” and xsi:type=”PIVL_TS”] …/@institutionSpecified …/period/@value …/period/@unit |
.dosageInstruction.timing.repeat.frequency .dosageInstruction.timing.repeat.period .dosageInstruction.timing.repeat.periodUnit |
Compare: C-CDA Common Medication Frequencies and FHIR Timing Data Type |
Event-Based Timing /effectiveTime[operator=”A” and xsi:type=”EIVL_TS”] …/event/@code …/offset |
.dosageInstruction.timing.repeat.when .dosageInstruction.timing.repeat.offset |
@code vocabulary matches .when CDA offset must be converted to minutes for FHIR |
/routeCode | .dosageInstruction.route | CDA coding ↔ FHIR CodeableConcept |
/doseQuantity | .dosageInstruction.doseAndRate.doseQuantity | CDA ↔ FHIR Quantity |
/rateQuantity | .dosageInstruction.doseAndRate.rateQuantity | CDA ↔ FHIR Quantity |
/consumable/manufacturedProduct/manufacturedMaterial/code | .medicationCodeableConcept | CDA coding ↔ FHIR CodeableConcept |
/author | .requester & Provenance |
CDA ↔ FHIR Provenance |
/author/time | .authoredOn | Earliest, if more than one. CDA ↔ FHIR Time/Dates |
/precondition | .asNeededBoolean = true | The presence of a precondition element indicates asNeededBoolean should be true. More complex maps may be possible with .asNeededCodeableConcept. |
Indication /entryRelationship[@typeCode=”RSON”]/observation/value |
.reasonCode | CDA coding ↔ FHIR CodeableConcept |
Free text sig /entryRelationship/substanceAdministration[code/@code=”76662-6”]/text |
.dosageInstruction.text | |
Instruction Activity /entryRelationship[@typeCode=”SUBJ” and @inversionInd=”true”]/act |
.dosageInstruction.patientInstruction .dosageInstruction.additionalInstruction |
act/text or act/code/originalText can map to patientInstructions. If coded, can map to additionalInstruction. |
Comment Activity /entryRelationship/act[code/@code=”48767-8”]/text |
Annotation .note |
1. XPath abbrievated for C-CDA Medication Activity as:
ClinicalDocument/component/structuredBody/component/section[code/@code=”10160-0”]/entry/substanceAdministration
The consensus mapping example developed through multiple vendors are available below:
As reviewed in the methodology, a more comprehensive review was performed via spreadsheets. These spreadsheets have been consolidated and further revised in the tables above but are provided for reference here