This
page
is
part
of
the
FHIR
Specification
(v5.0.0:
R5
-
STU
v6.0.0-ballot2:
Release
6
Ballot
(2nd
Draft)
(see
Ballot
Notes
).
This
is
the
The
current
published
version
in
it's
permanent
home
(it
will
always
be
available
at
this
URL).
is
5.0.0
.
For
a
full
list
of
available
versions,
see
the
Directory
of
published
versions
.
Page
versions:
R5
R4B
R4
R3
FHIR
Infrastructure
Work
Group
|
Maturity Level : 2 | Standards Status : Trial Use |
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.
This table documents the FHIR Patch operations that may be used to specify changes to a resource:
| Type | Path | Name | Value | Index | source | destination | Details |
| add | Path at which to add the content | Name of the property to add | Datatype to add at nominated place | The 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 | |||
| insert | Path of the collection in which to insert the content | value (Datatype) to add at nominated place | index at which to insert |
The
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
|
|||
| delete | Path of the element to delete (if found) | Only a single element can be deleted | |||||
| replace | Path of the element to replace | value (Datatype) to replace it with | |||||
| move | Path of the collection in which to move the content | list index to move from | list index to move to | Move an element within a single list |
There are a few base rules that apply for all operations:
resolve()
function
(e.g.
like
Observation.subject.resolve().identifier
).
resolve()
SHALL
only
be
used
to
refer
to
contained
resource
within
the
resource
being
patched.
Servers
SHALL
NOT
allow
patch
operations
to
alter
other
resources
than
the
nominated
target,
and
SHOULD
return
an
error
if
the
patch
operation
tries
The FHIRPath patch operations are encoded in a Parameters resource as follows:
| Parameter | Type |
| type | code |
| path | string |
| name | string |
| value | * |
| index | integer |
| source | integer |
| destination | integer |
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>
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.
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"
}]
}]
}
]
}
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.