DSTU2 STU 3 Ballot
This page is part of the FHIR Specification (v1.0.2: DSTU 2). The current version which supercedes this version is

This page is part of the FHIR Specification (v1.6.0: STU 3 Ballot 4). The current version which supercedes this version is 5.0.0 . For a full list of available versions, see the Directory of published versions . For a full list of available versions, see the Directory of published versions . Page versions: . Page versions: R5 R4B R4 R3 R2

1.17.2 2.20.2 Extensibility Examples Extensibility Examples

In order to use an extension, there is a three step process: Define the extension Register the extension Use it in the instance This page contains examples of how this process executes.
FHIR Infrastructure FHIR Infrastructure Work Group Work Group Maturity Level : N/A Maturity Level : N/A Ballot Status : DSTU 2 Ballot Status : STU 3

In order to use an extension, there is a three step process:

  1. Define the extension
  2. Register the extension
  3. Use it in the instance

This page contains examples of how this process executes.

1.17.2.1 Patient Consent for Record Sharing 2.20.2.1 Patient Consent for Record Sharing The basic patient resource contains no information relating to patient consent, and/or the policy under which the patient consents to their registration details. A social web provider of personal healthcare record (PHR) services might be obliged to keep track of the particular policy under which a patient has created their relationship with the PHR provider, and share this with their participants via their FHIR API. If they wish, they can extend the patient resource to represent the patient's participation agreement. Note that other approaches to this problem are possible, but it suffices to demonstrate the extension process. For the purposes of this example, we assume that the patient agrees to a participation policy as part of their sign up, and that as the provider has to change their policy, they ask patients to agree to new participation details. Each participation agreement has a URI by which it is identified, and the patient resource will carry this URI for each policy agreement that the patient has agreed to.

The basic patient resource contains no information relating to patient consent, and/or the policy under which the patient consents to their registration details. A social web provider of personal healthcare record (PHR) services might be obliged to keep track of the particular policy under which a patient has created their relationship with the PHR provider, and share this with their participants via their FHIR API. If they wish, they can extend the patient resource to represent the patient's participation agreement. Note that other approaches to this problem are possible, but it suffices to demonstrate the extension process.

For the purposes of this example, we assume that the patient agrees to a participation policy as part of their sign up, and that as the provider has to change their policy, they ask patients to agree to new participation details. Each participation agreement has a URI by which it is identified, and the patient resource will carry this URI for each policy agreement that the patient has agreed to.

1.17.2.1.1 2.20.2.1.1 Define the Extension Define the Extension For each extension, the first thing to do is to fill out the definitional properties of the extension :

For each extension, the first thing to do is to fill out the definitional properties of the extension :

Code "participation-agreement"
Context This extension is used in the patient resource This extension is used in the patient resource
Short Defn Short Defn Agreed agreement/policy Agreed agreement/policy
Definition A URI that identifies a participation agreement/policy to which the patient has agreed A URI that identifies a participation agreement/policy to which the patient has agreed
Comments URI is a literal reference to agreement text (html) URI is a literal reference to agreement text (html)
Cardinality 1..* (patient cannot participate without at least one agreement) 1..* (patient cannot participate without at least one agreement)
Type uri
XPaths no Invariants no Invariants
is Modifier is Modifier No (The participation agreements do not affect that interpretation of the elements of the patient, though they will likely influence how the system interacts with the patient) No (The participation agreements do not affect that interpretation of the elements of the patient, though they will likely influence how the system interacts with the patient)
Binding (No binding - not a coded value) (No binding - not a coded value)

1.17.2.1.2 2.20.2.1.2 Write the Definition of the Extension Write the Definition of the Extension From this table, we can build a formal extension definition. In this case, it looks like this:

From this table, we can build a formal extension definition. In this case, it looks like this:

<StructureDefinition xmlns="http://hl7.org/fhir">
  <url value="http://example.org/fhir/StructureDefinition/participation-agreement" />
  <name value="Example Extension Definition" />
  <!-- snip other metadata -->
  <kind value="datatype" />
  <constrainedType value="Extension" />

  <contextType value="resource" />
  <context value="Patient" />
  <type value="Extension" />
  <baseDefinition value="http://hl7.org.fhir/StructureDefinition/Extension" />
  <derivation value="constraint" />


  <differential>
    <element>
      <path value="Extension"/>
      <short value="Agreed agreement/policy" />
      <definition value="A URI that identifies a participation agreement/policy 
        to which the patient has agreed" />
      <comments value="URI is a literal reference to agreement text (html). 
        Systems SHALL conform to the policies as indicated. 
        For further information, see the partnership agreement..." />
      <mustSupport value="true" />
      <isModifier value="false" />
    </element>
    <element>
      <path value="Extension.valueUri"/>
      <short value="The URI value" />
      <min value="1" />
      <max value="*" />
      <type>
         <code value="uri" />
      </type>
      <mustSupport value="true" />
    </element>
  </differential>
</StructureDefinition>
Note
that
usually
you
would
build
the
actual
profile
using
some
tool.
This
example
was
built
by
hand
for
this
example.

Note that usually you would build the actual profile using some tool. This example was built by hand for this example.

1.17.2.1.3 2.20.2.1.3 Register the Extension Register the Extension This means the profile shown above that defines the extension is placed on the web somewhere. By preference, it will be hosted in a FHIR Profile endpoint, and the best location of all is the HL7 Profile registry (yet to be implemented). For this example, we assume that it has been uploaded to the PHR provider's own website at http://example.org/phr/documents/fhir/extensions.

This means the profile shown above that defines the extension is placed on the web somewhere. By preference, it will be hosted in a FHIR Profile endpoint, and the best location of all is the HL7 Profile registry (yet to be implemented).

For this example, we assume that it has been uploaded to the PHR provider's own website at http://example.org/phr/documents/fhir/extensions.

1.17.2.1.4 2.20.2.1.4 Use it in the instance Use it in the instance To use the extension in an instance, the extension is placed in the root of the resource. Note that the URL of the extension refers to the registered location, with the id of the extension as a fragment identifier.

To use the extension in an instance, the extension is placed in the root of the resource. Note that the URL of the extension refers to the registered location, with the id of the extension as a fragment identifier.

<Patient xmlns="http://hl7.org/fhir">
  <extension url="http://example.org/phr/documents/fhir/extensions/participation-agreement" >
    <valueUri value="http://example.org/phr/documents/patient/general/v1" />
  </extension>
    
</Patient>

1.17.2.1.5 Adding it to Patient StructureDefinition 2.20.2.1.5 Adding it to Patient StructureDefinition The profile definition above simply defines the extension "participation-agreement", and says that it is used with patient. But the profile above doesn't say that the server actually uses it. For the PHR provider to indicate that all the patients resources will use this resource, a StructureDefinition on the patient resource is used:

The profile definition above simply defines the extension "participation-agreement", and says that it is used with patient. But the profile above doesn't say that the server actually uses it. For the PHR provider to indicate that all the patients resources will use this resource, a StructureDefinition on the patient resource is used:

<StructureDefinition xmlns="http://hl7.org/fhir">
  <id value="patient-profile" />
  <!-- snip other metadata, narrative -->
  <differential>

    <!-- first, the patient root element 
      - can be copy/paste from the base patient profile -->    
    <element>
      <path value="Patient"/>
      <!-- snip definition -->
    </element>
    
    <!-- now, the general definition for extensions
      - can be copy/paste from the base patient profile,
      with changes for slicing  -->
    <element>
      <path value="Patient.extension"/>
      <name value="base extension"/>
      <!-- we're going to slice the extension element, and 
        one of the extensions is one we have defined -->
      <slicing>
        <!-- extension is always sliced on url -->
        <discriminator value="url"/> 
        <!-- we don't care what the order of any extensions is -->
        <ordered value="false"/>
        <!-- Other extensions are allowed in addition to this one -->
        <rules value="open"/>
      </slicing>
      <!-- snip definition -->
    </element>
    
    <!-- now, the slice that contains our extension -->    
    <element>
      <path value="Patient.extension"/>
      <!-- clone information from the extension definition. 
        duplicative, but this duplication makes it over all simpler -->
      <short value="Agreed agreement/policy"/>
      <definition value="A URI that identifies a participation agreement/policy 
      to which the patient has agreed"/>
      <!--  min has to be 1, since the extension itself has min = 1 -->
      <min value="1"/>
      <max value="*"/>
      <type>
        <!-- obviously it has to be an extension -->
        <code value="Extension"/>
        <!-- and here is the link to the extension definition:
          this extension has to conform to the rules laid down in its definition -->
        <profile value="http://example.org/phr/documents/fhir/extensions#participation-agreement"/>
      </type>
      <isModifier value="false"/>
    </element>
    
  <!-- snip the rest of the profile -->

  </differential>
</StructureDefinition>

Note
-
this
step
is
optional.

Note - this step is optional.

1.17.2.2 Patient Name Parts 2.20.2.2 Patient Name Parts ISO 21090 (Healthcare Data Types) defines a concept called a "name part qualifier" that contains extra information about how a particular name part should be used or interpreted. In practice, this field is used rarely, except in particular cultural contexts, where certain part qualifiers are used as a matter of practice. Following the FHIR design policy , such a field is not included in the overall definition of the core name data type, instead is it added as an extension. In practice, for cases such as these in ISO 21090, HL7 provides common extensions, and these are defined at [location still to be finalized].

ISO 21090 (Healthcare Data Types) defines a concept called a "name part qualifier" that contains extra information about how a particular name part should be used or interpreted. In practice, this field is used rarely, except in particular cultural contexts, where certain part qualifiers are used as a matter of practice. Following the FHIR design policy , such a field is not included in the overall definition of the core name data type, instead is it added as an extension.

In practice, for cases such as these in ISO 21090, HL7 provides common extensions, and these are defined at [location still to be finalized].

1.17.2.2.1 2.20.2.2.1 Define the Extension Define the Extension For each extension, the first thing to do is to fill out the definitional properties of the extension :

For each extension, the first thing to do is to fill out the definitional properties of the extension :

Not all the codes of the EntityNamePartQualifierR2 are required in this context, because prefix and suffix are explicitly part of the name types. Rather than simply refer to the OID for EntityNamePartQualifierR2 (2.16.840.1.113883.5.1122), in this case we enumerate the available codes, and set the type of the extension to code. The type of "code" is only allowed if the profile itself defines the codes that can be used. Here is a table of the codes (see the EntityNamePartQualifierR2
Code "name-qualifier"
Context This extension can be used anywhere a HumanName.part appears This extension can be used anywhere a HumanName.part appears
Short Defn Short Defn (one of the codes) LS | AC | NB | PR | HON | BR | AD | SP | MID | CL | IN (one of the codes) LS | AC | NB | PR | HON | BR | AD | SP | MID | CL | IN
Definition A set of codes each of which specifies a certain subcategory of the name part in addition to the main name part type A set of codes each of which specifies a certain subcategory of the name part in addition to the main name part type
Comments Used to indicate additional information about the name part and how it should be used Used to indicate additional information about the name part and how it should be used
Cardinality 0..* (this is always optional, but more than one can be used if required) 0..* (this is always optional, but more than one can be used if required)
Type code
XPaths N/A
Is Modifier Is Modifier No (Qualifiers do not change the fact that the part is a given or family name) No (Qualifiers do not change the fact that the part is a given or family name)
RIM Mapping RIM Mapping ENXP.qualifier
v2 Mapping v2 Mapping N/A
Binding Bound to a subset of the codes specified for EntityNamePartQualifierR2 in ISO 21090 Bound to a subset of the codes specified for EntityNamePartQualifierR2 in ISO 21090

Not all the codes of the EntityNamePartQualifierR2 are required in this context, because prefix and suffix are explicitly part of the name types. Rather than simply refer to the OID for EntityNamePartQualifierR2 (2.16.840.1.113883.5.1122), in this case we enumerate the available codes, and set the type of the extension to code. The type of "code" is only allowed if the profile itself defines the codes that can be used. Here is a table of the codes (see the EntityNamePartQualifierR2 reference for the full definitions): reference for the full definitions):

This is all then represented formally in a profile. Such profiles do not need to include constraint statements of resources; instead, they include just extension declarations and their associated bindings. In this case, the definition looks like this:
LS Legal status Legal status For organizations a suffix... For organizations a suffix...
AC Academic Indicates that a prefix like "D... Indicates that a prefix like "D...
NB Nobility In Europe and Asia, there are s... In Europe and Asia, there are s...
PR Professional Primarily in the British Im... Primarily in the British Im...
HON Honorific An honorific such as 'The Rig... An honorific such as 'The Rig...
BR Birth A name that a person was given at ... A name that a person was given at ...
AD Acquired A name part a person acquired. ... A name part a person acquired. ...
SP Spouse The name assumed from the partner... The name assumed from the partner...
MID Middle Name Middle Name Indicates that the name par... Indicates that the name par...
CL Call me Call me Callme is used to indicate which... Callme is used to indicate which...
IN Initial Indicates that a name part is ju... Indicates that a name part is ju...

This is all then represented formally in a profile. Such profiles do not need to include constraint statements of resources; instead, they include just extension declarations and their associated bindings. In this case, the definition looks like this:

<StructureDefinition xmlns="http://hl7.org/fhir">
  <url value="http://hl7.org/fhir/StructureDefinition/iso21090-EN-qualifier" />
  <name value="iso-21090 Name Qualifier" />
  <!-- snip other metadata, including definition of RIM Mapping -->
  <kind value="datatype" />
  <constrainedType value="Extension" />

  <contextType value="datatype" />
  <context value="HumanName.given" />
  <context value="HumanName.prefix" />
  <context value="HumanName.family" />
  <context value="HumanName.suffix" />
  <type value="Extension" />
  <baseDefinition value="http://hl7.org.fhir/StructureDefinition/Extension" />
  <derivation value="constraint" />

  <differential>
    <element>
      <path value="Extension"/>
      <short value="LS | AC | NB | PR | HON | BR | AD | SP | MID | CL | IN" />
      <definition value="A set of codes each of which specifies a certain subcategory
          of the name part in addition to the main name part type" />
      <comments value="Used to indicate additional information about the
             name part and how it should be used" />
      <mustSupport value="false" />
      <isModifier value="false" />
    </element>
    <element>
      <path value="Extension.value"/>
      <short value="LS | AC | NB | PR | HON | BR | AD | SP | MID | CL | IN" />
      <min value="0" />
      <max value="*" />
      <type>
         <code value="code" />
      </type>
      <binding>
        <strength value="required" />
        <description value="A set of codes each of which specifies a certain subcategory
            of the name part in addition to the main name part type" />
        <valueSetReference>
          <reference value="ValueSet/name-part-qualifier" />
        </valueSetReference>
      </binding>
      <mapping>
         <identity value="RIM" />
         <map value="ENXP.qualifier" />
      </mapping>
    </element>
  </differential>
</StructureDefinition>

Note
that
usually
you
would
build
the
actual
profile
using
some
tool.
This
example
was
built
from
a
spreadsheet
definition
by
the
FHIR
build
tooling.

Note that usually you would build the actual profile using some tool. This example was built from a spreadsheet definition by the FHIR build tooling.

1.17.2.2.2 2.20.2.2.2 Register the Extension Register the Extension For this example, it is registered at http://hl7.org/fhir/StructureDefinition/iso21090-EN-qualifier

For this example, it is registered at http://hl7.org/fhir/StructureDefinition/iso21090-EN-qualifier . This is the URL that will appear in the definition element when the extension is used. . This is the URL that will appear in the definition element when the extension is used.

1.17.2.2.3 2.20.2.2.3 Use it in the instance Use it in the instance To use the extension in an instance, the extension is nested within the attribute that is extended. Note that the URL of the extension refers to the registered location, with the id of the extension as a fragment identifier.

To use the extension in an instance, the extension is nested within the attribute that is extended. Note that the URL of the extension refers to the registered location, with the id of the extension as a fragment identifier.

<name>
  <use value="official" />
  <given value="Östlund">
     <extension url="http://hl7.org/fhir/StructureDefinition/iso21090-EN-qualifier" >
        <valueCode value="MID" />
     </extension>
  </given>
</name>
This
particular
example
is
a
Scandinavian
mellannamn.
See
Datatypes
examples
for
additional
examples
.

This particular example is a Scandinavian mellannamn. See Datatypes examples for additional examples .

1.17.2.3 Complex Extension: Patient Clinical Trial 2.20.2.3 Complex Extension: Patient Clinical Trial Defining complex extensions is a little different. They have the same meta data - context etc., but differ in the internal structure. As an example, consider enrolling a patient in a clinical trial. There are 3 data items to collect:

Defining complex extensions is a little different. They have the same meta data - context etc., but differ in the internal structure. As an example, consider enrolling a patient in a clinical trial. There are 3 data items to collect:

Code Name Cardinality Type Content
NCT Clinical Trial number Clinical Trial number 1..1 string The format for the US ClinicalTrials.gov registry number is "NCT" followed by an 8-digit number, e.g.: NCT00000419 The format for the US ClinicalTrials.gov registry number is "NCT" followed by an 8-digit number, e.g.: NCT00000419
period trialPeriod 0..1 Period The start and end times of the participation of this patient in the clinical trial reason The start and end times of the participation of this patient in the clinical trial
reason enrolled reason enrolled 0..1 CodableConcept indication or reason the patient is part of this trial Like simple extensions, the first thing to do is to assign a URI to the extension. Since this one is part of the FHIR publication, it is assigned a URI where it will be published: http://hl7.org/fhir/StructureDefinition/patient-clinicalTrial. Internally, in the extension, the cardinality of the value[x] element is set to 0, since it will not (and cannot) be used. Then, the Extension.extension element is sliced by url, and 3 slices are defined, each with a fixed relative URI which is the code from the table above. Here's the relevant parts of the definition of this extension: indication or reason the patient is part of this trial

Like simple extensions, the first thing to do is to assign a URI to the extension. Since this one is part of the FHIR publication, it is assigned a URI where it will be published: http://hl7.org/fhir/StructureDefinition/patient-clinicalTrial.

Internally, in the extension, the cardinality of the value[x] element is set to 0, since it will not (and cannot) be used. Then, the Extension.extension element is sliced by url, and 3 slices are defined, each with a fixed relative URI which is the code from the table above. Here's the relevant parts of the definition of this extension:

<StructureDefinition xmlns="http://hl7.org/fhir">
  <!-- metadata - setting up the base definition -->
  <url value="http://hl7.org/fhir/StructureDefinition/patient-clinicalTrial"/>
  <name value="The patient's participation in clinical trials"/>
  <constrainedType value="Extension"/>

  <contextType value="resource"/>
  <context value="Patient"/>
  <base value="http://hl7.org/fhir/StructureDefinition/Extension"/>

  <type value="Extension" />
  <baseDefinition value="http://hl7.org.fhir/StructureDefinition/Extension" />
  <derivation value="constraint" />

  <snapshot>
    <element>
      <path value="Extension"/>
      <!-- etc.-->
    </element>
    
    <!-- set up the slicing -->
    <element>
      <path value="Extension.extension"/>
      <slicing>
        <discriminator value="url"/>
        <ordered value="true"/>
        <rules value="openAtEnd"/>
      </slicing>
    </element>

    <!-- first slice, NCT -->
    <element>
      <path value="Extension.extension"/>
      <name value="NCT"/>
      <short value="National Clinical Trial number"/>
      <min value="1"/>
      <max value="1"/>
    </element>
    <element>
      <path value="Extension.extension.extension"/>
      <min value="0"/>
      <max value="0"/> <!-- not allowed to be used -->
    </element>
    <element>
      <path value="Extension.extension.url"/>
      <min value="1"/>
      <max value="1"/>
      <fixedUri value="NCT"/>
    </element>
    <element>
      <path value="Extension.extension.valueString"/>
      <min value="1"/>
      <max value="1"/>
      <type>
        <code value="string"/>
      </type>
    </element>

    <!-- second slice, period -->
    <element>
      <path value="Extension.extension"/>
      <name value="period"/>
      <short value="The period of participation in the clinical trial"/>
      <min value="0"/>
      <max value="1"/>
    </element>
    </element>
    <element>
      <path value="Extension.extension.extension"/>
      <min value="0"/>
      <max value="0"/>
    </element>
    <element>
      <path value="Extension.extension.url"/>
      <min value="1"/>
      <fixedUri value="period"/>
    </element>
    <element>
      <path value="Extension.extension.valuePeriod"/>
      <type>
        <code value="Period"/>
      </type>
    </element>

    <!-- third slice, reason -->
    <element>
      <path value="Extension.extension"/>
      <name value="reason"/>
      <short value="The reason for participation in the clinical trial"/>
      <min value="0"/>
      <max value="1"/>
    </element>
    <element>
      <path value="Extension.extension.extension"/>
      <min value="0"/>
      <max value="0"/>
    </element>
    <element>
      <path value="Extension.extension.url"/>
      <min value="1"/>
      <fixedUri value="reason"/>
    </element>
    <element>
      <path value="Extension.extension.valueCodeableConcept"/>
      <type>
        <code value="CodeableConcept"/>
      </type>
    </element>

    <!-- last (for order reasons): the fixed URI -->
    <element>
      <path value="Extension.url"/>
      <fixedUri value="http://hl7.org/fhir/StructureDefinition/patient-clinicalTrial"/>
    </element>
    <!-- and no value in the root -->
    <element>
      <path value="Extension.value[x]"/>
      <min value="0"/>
      <max value="0"/>
    </element>
  </snapshot>
</StructureDefinition>
On This Page:

On This Page:

| Version History | Table of Contents | Compare to DSTU1