View raw Markdown
type: docsource: source/fhirpatch.html

[%settitle FHIRPath Patch%] [%file newheader%] [%file newnavbar%]

FHIRPath Patch

Responsible Owner: [[%wgt fhir%]]([%wg fhir%]) Work GroupStandards Status:Normative

This page defines a FHIR Parameters-based, syntax-agnostic patch mechanism where elements to be manipulated by the patch interaction are described using their FHIRpath names and navigation.

Operations

This table documents the FHIR Patch operations that may be used to specify changes to a resource:

TypePathNameValueIndexsourcedestinationDetails
addPath at which to add the contentName of the property to addDatatype to add at nominated placeThe content will be appended to the element identified in the path, using the name specified. Add can used for non-repeating elements as long as they do not already exist
insertPath of the collection in which to insert the contentvalue (Datatype) to add at nominated placeindex at which to insertThe content will be inserted into the nominated list at the index specified (0 based). The index is mandatory and must be equal or less than the number of elements in the list. Note: add is easier than insert at the end of the list
deletePath of the element to delete (if found)Only a single element can be deleted
replacePath of the element to replacevalue (Datatype) to replace it with
movePath of the collection in which to move the contentlist index to move fromlist index to move toMove an element within a single list

There are a few base rules that apply for all operations:

Parameters Format

The FHIRPath patch operations are encoded in a Parameters resource as follows:

A profile for this has been defined on the Parameters resource.

ParameterType
typecode
pathstring
namestring
value*
indexinteger
sourceinteger
destinationinteger

Here is an example of adding an element:

<Parameters xmlns="http://hl7.org/fhir"> <parameter> <name value="operation"/> <part> <name value="type"/> <valueCode value="add"/> </part> <part> <name value="path"/> <valueString value="Patient"/> </part> <part> <name value="name"/> <valueString value="birthDate"/> </part> <part> <name value="value"/> <valueDate value="1930-01-01"/> </part> </parameter> </Parameters>

Anonymous Types

Only some named datatypes (see the list) are allowed to be used directly in parameters. In order to add or insert other kinds of types - including anonymous elements (e.g., Observation.component, Timing.repeat), the content is defined by defining the name as described above, and instead of providing a value, a set of parts that are values are provided. Here is an example:

<Parameters xmlns="http://hl7.org/fhir"> <parameter> <name value="operation"/> <part> <name value="type"/> <valueCode value="add"/> </part> <part> <name value="path"/> <valueString value="Patient"/> </part> <part> <name value="name"/> <valueString value="contact"/> </part> <part> <name value="value"/> <part> <name value="name"/> <valueHumanName> <text value="a name"/> </valueHumanName> </part> </part> </parameter> </Parameters>

This pattern repeats as deep as necessary.

Choice Elements

Note that for elements with a choice of data types, the FHIRPath name in the name of the parameter does not include the data type suffix (per the rules in the FHIRPath Specification), but the parameter value does. Here's an example:

{ "resourceType": "Parameters", "parameter": [{ "name": "operation", "part": [{ "name": "type", "valueCode": "add" }, { "name": "path", "valueString": "Specimen" }, { "name": "name", "valueString": "processing" }, { "name": "value", "part": [{ "name": "description", "valueString": "testProcessing" }, { "name": "time", "valueDateTime": "2021-08-18T11:32:55.6462761+02:00" }] }] } ] }

Extension Example

An example of adding an extension:

<Parameters xmlns="http://hl7.org/fhir"> <parameter> <name value="operation"/> <part> <name value="type"/> <valueString value="add"/> </part> <part> <name value="path"/> <valueString value="Specimen"/> </part> <part> <name value="name"/> <valueString value="processing"/> </part> <part> <name value="value" /> <part> <name value="description" /> <valueString value="test" /> </part> <part> <name value="time" /> <valueDateTime value="2021-08-13T07:44:38.342+00:00" /> </part> <part> <name value="extension" /> <part> <name value="url" /> <valueUri value="http://example.org/fhir/DeviceExtension" /> </part> <part> <name value="value" /> <valueReference> <reference reference="Device/1"> </valueReference> </part> </part> </part> </parameter> </Parameters>

Applied to an empty Specimen, this would produce:

<Specimen xmlns="http://hl7.org/fhir"> <status value="available"/> <processing> <extension url="http://example.org/fhir/DeviceExtension"> <valueReference> <reference reference="Device/1"> </valueReference> </extension> <description value="test"/> <timeDateTime value="2021-08-13T07:44:38.342+00:00"/> </processing> </Specimen>

There is a set of test cases for implementers in the fhir-test-cases repository.

Complex Path Example

Note that the path parameter value is a FHIRPath expression, and not a simple path. For example, in the following patch operation, the path parameter value is a FHIRPath expression that selects the period element of the identifier element with a use value of official.

{ "resourceType": "Parameters", "parameter": [ { "name": "operation", "part": [ { "name": "type", "valueCode": "add" }, { "name": "path", "valueString": "Patient.identifier.where(use = 'official').period" }, { "name": "name", "valueString": "end" }, { "name": "value", "valueDate": "2021-12-01" } ] } ] }

There is a set of test cases for implementers in the fhir-test-cases repository.

[%file newfooter%]