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 Immunizations FHIR → CDA. For guidance on how to read the table below, see Reading the C-CDA ↔ FHIR Mapping Pages
Mapping is from @moodCode="EVN"
(i.e. historical) immunizations, not INT
(future / planned) immunizations.
C-CDA¹ Immunization Activity substanceAdministration |
FHIR Immunization |
Transform Steps |
---|---|---|
/@negationInd=”true” | Set .status="not-done" when @negationInd=”true” |
|
/id | .identifier | CDA id ↔ FHIR identifier |
/statusCode | .status | CDA statusCode → FHIR status |
/effectiveTime/@value or /effectiveTime/low/@value |
.occurrenceDateTime | EVN immunizations typically only contain a value, but if effectiveTime contains low/high, the occurenceDateTime should come from low. CDA ↔ FHIR Time/Dates |
/repeatNumber/@value | .protocolApplied.doseNumberPositiveInt | Note: for @moodCode=EVN immunizations only |
/routeCode | .route | CDA coding ↔ FHIR CodeableConcept |
/approachSiteCode | .site | CDA coding ↔ FHIR CodeableConcept |
/doseQuantity | .doseQuantity | CDA ↔ FHIR Quantity |
/consumable/manufacturedProduct/manufacturedMaterial/code | .vaccineCode | CDA coding ↔ FHIR CodeableConcept |
/consumable/manufacturedMaterial/lotNumberText | .lotNumber | |
/consumable/manufacturedMaterial/manufacturerOrganization | .manufacturer | |
N/A | .primarySource | Since this is unavailable in CDA, when mapping to a FHIR profile that requires the element (such as USCore prior to Release 6), include a data-absent-reason extension. |
/author | Provenance | CDA ↔ FHIR Provenance |
/author/time | .recorded | Earliest, if more than one. CDA ↔ FHIR Time/Dates |
/performer | .performer | Set performer.function="AP" |
Immunization Refusal Reason /entryRelationship[@typeCode=”RSON”]²/observation/code (only if code is from ValueSet No Immunization Reason) |
.statusReason | CDA refusal → FHIR statusReason Indicates the reason the immunization event was not performed. This is generally only used for the status of “not-done”. |
Indication /entryRelationship[@typeCode=”RSON”]²/observation/value (only if observation/code is from ValueSet Problem Type) |
.reasonCode | CDA coding ↔ FHIR CodeableConcept |
Reaction /entryRelationship[@typeCode=”MFST”]/observation/value |
.reaction | It is recommended that reaction observation value be mapped to reaction detail (Observation) valueCodeable concept. Comments are welcome on how this may be best implemented. |
Comment Activity /entryRelationship/act[code/@code=”48767-8”]/text |
Annotation .note |
1. XPath abbrievated for C-CDA Immunization Activity as:
ClinicalDocument/component/structuredBody/component/section[code/@code=”11369-6”]/entry/substanceAdministration
2. Both indication and refusal reason are observations related by @typeCode=”RSON”. Typically templateIds should not be used to identify content, but the Indication template does not require a specific code. If the observation/code comes from ValueSet No Immunization Reason, then it is clearly a refusal reason. If it comes from ValueSet Problem Type, then it is an indication. But if the code comes from neither value set, the observation is possibly an indication, but the only way to know is to check the templateId.
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