C-CDA on FHIR
2.0.0-ballot - STU 2 Ballot United States of America flag

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 2.0.0-ballot 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

C-CDA to FHIR Vital Signs

This page provides a mapping from CDA to FHIR. For the FHIR to CDA mapping, please refer to Vitals FHIR → CDA. For guidance on how to read the table below, see Reading the C-CDA ↔ FHIR Mapping Pages.

C-CDA vitals are typically grouped into a Vital Signs Organizer to group one or more vitals readings together. This has been mapped to an additional FHIR Observation for the panel of vital signs. This panel contains a .hasMember field which references each observation mapped from the original C-CDA Vital Signs Organizer.

C-CDA Vital Signs Organizer to FHIR Observation Panel

C-CDA¹
Vital SignsOrganizer
FHIR
Vital Signs Observation
Transform Steps
/id .identifier CDA id ↔ FHIR identifier
  .category Set to vital-signs from Vital Signs value set
  .code Set to 85353-1 CDA coding ↔ FHIR CodeableConcept
/statusCode .status final (C-CDA is fixed to completed)
/effectiveTime .effectiveDateTime
or
.effectivePeriod
If low and high are identical, use effectiveDateTime. If organizer/effectiveTime is missing, use the earliest and latest observation/effectiveTime as the source of the mapping.
CDA ↔ FHIR Time/Dates
  .hasMember Reference to each vital sign observation mapped from CDA

C-CDA Vital Signs Observation to FHIR Observation

C-CDA¹
Vital Sign Observation
FHIR
Vital Signs Observation
Transform Steps
Note: US Core defines separate profiles for individual vitals such as weight, heart rate, etc.
/id .identifier CDA id ↔ FHIR identifier
  .category Set to vital-signs from Vital Signs value set
/code .code² CDA coding ↔ FHIR CodeableConcept
/effectiveTime .effectiveDateTime
or
.effectivePeriod
Prefer effectiveDateTime
CDA ↔ FHIR Time/Dates
value .valueQuantity² CDA ↔ FHIR Quantity
/interpretationCode .interpretation² CDA coding ↔ FHIR CodeableConcept
/methodCode .method CDA coding ↔ FHIR CodeableConcept
/targetSiteCode .bodySite CDA coding ↔ FHIR CodeableConcept
/author .performer
&
Provenance
CDA ↔ FHIR Provenance
/referenceRange/observationRange/interpretationCode Not Supported FHIR expects reference ranges to be "normal" ranges. If C-CDA includes multiple reference ranges, only map the one with interpretationCode = "N".
/referenceRange/observationRange/value[xsi:type=IVL_PQ] .referenceRange.low²
&
.referenceRange.high²
CDA ↔ FHIR Quantity
/referenceRange/observationRange/value[xsi:type=ST]
or
/referenceRange/observationRange/text
.referenceRange.text²  

1. XPath abbreviated for C-CDA Vital Signs Observation as:
ClinicalDocument/component/structuredBody/component/section[code/@code="8716-3"]/entry/organizer/entryRelationship/component

2. Some C-CDA observations need special handling when converting to FHIR. When recording the following vitals, the value, interpretation, and referenceRange should be placed in a .component element within a parent Observation.

Blood Pressure (C-CDA observations with codes 8480-6 - systolic & 8462-4 - diastolic)

  • Set Observation.code to 85354-9 (Blood Pressure Panel) and create 2 components for the systolic and diastolic readings. Both components are required.
  • Do not send Observation.valueQuantity

Pulse Oximetry (C-CDA observations with codes 3150-0 - Inhaled Oxygen Concentration, 3151-8 - Inhaled Oxygen Flow Rate, 59408-5 - Oxygen saturation in Arterial blood by Pulse oximetry, or 2708-6 - Oxygen saturation in Arterial blood)

  • Observation.code should contain two coding values: 59408-5 & 2708-6
  • Observation.valueQuantity represents the Oxygen saturation (e.g. 98%)
  • Create individual components for 3150-0 - Inhaled Oxygen Concentration & 3151-8 - Inhaled Oxygen Flow Rate (only if values exist)

Example: Simple Vitals Panel

CDA Vitals ExampleFHIR Observation Resources
<organizer classCode="CLUSTER" moodCode="EVN"> <templateId root="2.16.840.1.113883.10.20.22.4.26"/> <templateId root="2.16.840.1.113883.10.20.22.4.26" extension="2015-08-01"/> <id extension="21688133041015158234" root="2.16.840.1.113883.3.42.126.100001.19"/> <code code="46680005" displayName="Vital Signs" codeSystem="2.16.840.1.113883.6.96" codeSystemName="SNOMED CT"> <translation code="74728-7" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC"/> </code> <statusCode code="completed"/> <effectiveTime value="20140520193605-0600"/> <!-- Each vital sign should be its own component. --> <component> <observation classCode="OBS" moodCode="EVN"> <templateId root="2.16.840.1.113883.10.20.22.4.27"/> <templateId root="2.16.840.1.113883.10.20.22.4.27" extension="2014-06-09"/> <id extension="216881330410151584" root="2.16.840.1.113883.3.42.126.100001.19"/> <code code="8867-4" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC" displayName="HEART RATE"/> <text> <reference value="#Pulse_1"/> </text> <statusCode code="completed"/> <effectiveTime value="20140520193605-0600"/> <value xsi:type="PQ" value="80" unit="/min"/> </observation> </component> </organizer>
Note: The following shows an Observation resource for the panel with an individual Observation resource embedded in its contained property. This was done for ease of creating a single, visual, highlighted example, but implementers may choose to create separate, external resources according to their own policy.
{ "resourceType": "Observation", "identifier": [{ "value": "21688133041015158234", "system": "urn:oid:2.16.840.1.113883.3.42.126.100001.19" }], "status": "final", "category": [{ "text": "vital-signs", "coding": [{ "code": "vital-signs", "system": "http://terminology.hl7.org/CodeSystem/observation-category", "display": "Vital Signs" }] }], "code": { "text": "Vital Signs Panel", "coding": [{ "code": "85353-1", "system": "http://loinc.org" }] }, "subject": { "reference": "urn:uuid:a4986486-6599-4bb2-a7fb-e2deb8d50b5e" }, "effectiveDateTime": "2014-05-20T19:36:05-06:00", "hasMember": [{ "reference": "#heartRate" }], "contains": [{ "resourceType": "Observation", "id": "heartRate", "identifier": [{ "system": "urn:oid:2.16.840.1.113883.3.42.126.100001.19", "value": "216881330410151584" }], "status": "final", "category": [{ "coding": [{ "system": "http://terminology.hl7.org/CodeSystem/observation-category", "code": "vital-signs", "display": "Vital Signs" }] }], "code": { "coding": [{ "system": "http://loinc.org", "code": "8867-4", "display": "HEART RATE" }] }, "subject": { "reference": "Patient/62f17e29b7532c0009e217b7" }, "effectiveDateTime": "2014-05-20T19:36:05-06:00", "valueQuantity": { "value": 80, "unit": "/min" } }] }

Example: Blood Pressure

C-CDA Blood Pressure (Codes & Values Only)FHIR Blood Pressure
<organizer> <!-- C-CDA Vital Signs Organizer --> <templateId root="2.16.840.1.113883.10.20.22.4.26" extension="2015-08-01" /> <id root="..." /> <code code="46680005" codeSystem="2.16.840.1.113883.6.96" codeSystemName="SNOMED CT" displayName="Vital Signs" /> <statusCode code="completed" /> <!-- effectiveTime, author, etc stripped --> <component> <observation> <!-- C-CDA Vital Signs Observation --> <templateId root="2.16.840.1.113883.10.20.22.4.27" extension="2014-06-09" /> <id root="..." /> <code code="8480-6" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC" displayName="Systolic blood pressure" /> <statusCode code="completed" /> <value xsi:type="PQ" value="115" unit="mm[Hg]" /> </observation> </component> <component> <observation> <!-- C-CDA Vital Signs Observation --> <templateId root="2.16.840.1.113883.10.20.22.4.27" extension="2014-06-09" /> <id root="..." /> <code code="8462-4" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC" displayName="Diastolic blood pressure" /> <value xsi:type="PQ" value="75" unit="mm[Hg]" /> </observation> </component> </organizer>
{ "resourceType" : "Observation", "status" : "final", "category" : [{ "coding" : [{ "system" : "http://terminology.hl7.org/CodeSystem/observation-category", "code" : "vital-signs" }] }], "code" : { "coding" : [{ "system" : "http://loinc.org", "code" : "85354-9", "display" : "Blood pressure panel with all children optional" }] }, "component" : [{ "code" : { "coding" : [{ "system" : "http://loinc.org", "code" : "8480-6", "display" : "Systolic blood pressure" }], "text" : "Systolic blood pressure" }, "valueQuantity" : { "value" : 115, "unit" : "mmHg", "system" : "http://unitsofmeasure.org", "code" : "mm[Hg]" } }, { "code" : { "coding" : [{ "system" : "http://loinc.org", "code" : "8462-4", "display" : "Diastolic blood pressure" }], "text" : "Diastolic blood pressure" }, "valueQuantity" : { "value" : 75, "unit" : "mmHg", "system" : "http://unitsofmeasure.org", "code" : "mm[Hg]" } }] }

Example: Pulse Oximetry

C-CDA Pulse Oximetry (Codes & Values Only)FHIR Pulse Oximetry
<organizer> <!-- C-CDA Vital Signs Organizer --> <templateId root="2.16.840.1.113883.10.20.22.4.26" extension="2015-08-01" /> <id root="..." /> <code code="46680005" codeSystem="2.16.840.1.113883.6.96" codeSystemName="SNOMED CT" displayName="Vital Signs" /> <statusCode code="completed" /> <!-- effectiveTime, author, etc stripped --> <component> <observation> <!-- C-CDA Vital Signs Observation --> <templateId root="2.16.840.1.113883.10.20.22.4.27" extension="2014-06-09" /> <id root="..." /> <code code="2708-6" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC" displayName="Oxygen saturation" /> <value xsi:type="PQ" value="98" unit="%" /> </observation> <observation> <!-- C-CDA Vital Signs Observation --> <templateId root="2.16.840.1.113883.10.20.22.4.27" extension="2014-06-09" /> <id root="..." /> <code code="3151-8" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC" displayName="Inhaled Oxygen Flow Rate" /> <value xsi:type="PQ" value="6" unit="L/min" /> </observation> <observation> <!-- C-CDA Vital Signs Observation --> <templateId root="2.16.840.1.113883.10.20.22.4.27" extension="2014-06-09" /> <id root="..." /> <code code="3150-0" codeSystem="2.16.840.1.113883.6.1" codeSystemName="LOINC" displayName="Inhaled Oxygen Concentration" /> <value xsi:type="PQ" value="35" unit="%" /> </observation> </component> </organizer>
{ "resourceType": "Observation", "status": "final", "category": [{ "coding": [{ "system": "http://terminology.hl7.org/CodeSystem/observation-category", "code": "vital-signs" }] }], "code": { "coding": [{ "system": "http://loinc.org", "code": "2708-6", "display": "Oxygen saturation in Arterial blood" }, { "system": "http://loinc.org", "code": "59408-5", "display": "Oxygen saturation in Arterial blood by Pulse oximetry" }] }, "valueQuantity": { "value": 98, "unit": "%", "system": "http://unitsofmeasure.org", "code": "%" }, "component": [{ "code": { "coding": [{ "system": "http://loinc.org", "code": "3151-8", "display": "Inhaled oxygen flow rate" }] }, "valueQuantity": { "value": 6, "unit": "liters/min", "system": "http://unitsofmeasure.org", "code": "L/min" } }, { "code": { "coding": [{ "system": "http://loinc.org", "code": "3150-0", "display": "Inhaled Oxygen Concentration" }] }, "valueQuantity": { "value": 35, "unit": "%", "system": "http://unitsofmeasure.org", "code": "%" } }] }