<?xml version=“1.0” encoding=“UTF-8”?> <ValueSet xmlns=“hl7.org/fhir”>

<id value="example-hierarchical"/>
      <meta>
              <!--    many expansions are not shareable, but this one is    -->
              <profile value="http://hl7.org/fhir/StructureDefinition/shareablevalueset"/>

  <security>
    <system value="http://terminology.hl7.org/CodeSystem/v3-ActReason"/>
    <code value="HTEST"/>
    <display value="test health data"/>
  </security>
</meta>

<contained>
  <!--  
    include the code system this value is derived from since it's been hacked a little, and for simplicity
   -->
  <CodeSystem>
                <id value="hacked"/>
    <url value="http://hl7.org/fhir/hacked"/> 
    <status value="draft"/>
    <description value="Issue type in an error message - hack from real FHIR List"/> 
    <content value="complete"/> 
    <property>
      <code value="notSelectable"/>
      <uri value="http://hl7.org/fhir/concept-properties#notSelectable"/>
      <type value="boolean"/>
    </property>
    <concept> <!--  invalid (abstract) + structure, required, value  -->
      <code value="invalid"/> 
      <display value="Invalid Content"/> 
      <property>
        <code value="notSelectable"/>
        <valueBoolean value="true"/>
      </property>
      <concept> 
        <code value="structure"/> 
        <display value="Structural Issue"/> 
      </concept> 
      <concept> 
        <code value="required"/> 
        <display value="Required element missing"/> 
      </concept> 
      <concept> 
        <code value="value"/> 
        <display value="Element value invalid"/> 
      </concept> 
    </concept> 
    <concept> <!--  security (abstract) + login | unknown | expired  -->
      <code value="security"/> 
      <display value="Security Problem"/> 
      <property>
        <code value="notSelectable"/>
        <valueBoolean value="true"/>
      </property>
      <concept> 
        <code value="login"/> 
        <display value="Login Required"/> 
      </concept> 
      <concept> 
        <code value="unknown"/> 
        <display value="Unknown User"/> 
      </concept> 
      <concept> 
        <code value="expired"/> 
        <display value="Session Expired"/> 
      </concept> 
    </concept> 
    <concept> <!--  Processing + duplicate | not-found | conflict  -->
      <code value="processing"/> 
      <display value="Processing Failure"/> 
      <concept> 
        <code value="duplicate"/> 
        <display value="Duplicate"/> 
      </concept> 
      <concept> 
        <code value="not-found"/> 
        <display value="Not Found"/> 
      </concept> 
      <concept> 
        <code value="conflict"/> 
        <display value="Edit Version Conflict"/> 
      </concept> 
    </concept> 
    <concept> <!--  transient + lock | exception | throttled  -->
      <code value="transient"/> 
      <display value="Transient Issue"/> 
      <concept> 
        <code value="lock-error"/> 
        <display value="Lock Error"/> 
      </concept> 
      <concept> 
        <code value="exception"/> 
        <display value="Exception"/> 
      </concept> 
      <concept> 
        <code value="throttled"/> 
        <display value="Throttled"/> 
      </concept> 
    </concept> 
  </CodeSystem> 
</contained>
<url value="http://hl7.org/fhir/ValueSet/example-hierarchical"/>
<version value="4.0.1"/>
      <name value="Example Hierarchical ValueSet"/>
<status value="draft"/>
      <experimental value="true"/>
      <date value="2018-07-20"/>
      <publisher value="FHIR Project team"/>
      <contact>
              <telecom>
                      <system value="url"/>
                      <value value="http://hl7.org/fhir"/>
              </telecom>
      </contact>
      <description value="Demonstration of extensions that build a hierarchical contains"/>
<compose>
  <!-- 
    the include by enumeration simply lists a set of codes with no structure

    we're going to introduce a hierarchy. There's 5 possibilities, each shown in this 
    complex example:
     1. the grouper we are introducing isn't in the code system
     2. The grouper matches a concept in the code system, which is in the value set
       a, it isn't abstract
       b. it is abstract
     3. The grouper matches a concept in the code system, which isn't in the value set
       a, it isn't abstract
       b. it is abstract

    1# we introduce a category for concepts for (most common)
     * (most common)
        + login (also below)
        + conflict (only here)

    #2a we replicate processing as a structure. it's not abstract
      * processing
        + duplicate, not-found

    #2b we replicate invalid as a structure. it's abstract
      * invalid
        + structure, required, value

    #3a we replicate transient as a structure. it's not abstract (but not in the value set)
      * transient
        + lock, exception, tbrottled

    #3b we replicate security as a structure. it's abstract (but not in the value set)
      * security
        + login | unknown

    please, no argument about whether this a good domain example; the point is illustrate the method
   -->

  <include>
    <extension url="http://hl7.org/fhir/StructureDefinition/valueset-expand-rules">
      <valueCode value="groups-only"/> 
    </extension>
    <!--  #1  -->
    <extension url="http://hl7.org/fhir/StructureDefinition/valueset-expand-group">
      <extension url="display">
        <valueString value="(Most common)"/>
      </extension>
      <extension url="member">
        <valueCode value="login"/>
      </extension>
      <extension url="member">
        <valueCode value="conflict"/>
      </extension>
    </extension>
    <!--  #2a  -->
    <extension url="http://hl7.org/fhir/StructureDefinition/valueset-expand-group">
      <extension url="code">
        <valueCode value="processing"/>
      </extension>
      <extension url="member">
        <valueCode value="duplicate"/>
      </extension>
      <extension url="member">
        <valueCode value="not-found"/>
      </extension>
    </extension>
    <!--  #2b  -->
    <extension url="http://hl7.org/fhir/StructureDefinition/valueset-expand-group">
      <extension url="code">
        <valueCode value="invalid"/>
      </extension>
      <extension url="member">
        <valueCode value="structure"/>
      </extension>
      <extension url="member">
        <valueCode value="required"/>
      </extension>
      <extension url="member">
        <valueCode value="value"/>
      </extension>
    </extension>
    <!--  #3a  -->
    <extension url="http://hl7.org/fhir/StructureDefinition/valueset-expand-group">
      <extension url="code">
        <valueCode value="transient"/>
      </extension>
      <extension url="member">
        <valueCode value="lock"/>
      </extension>
      <extension url="member">
        <valueCode value="exception"/>
      </extension>
      <extension url="member">
        <valueCode value="throttled"/>
      </extension>
    </extension>
    <!--  #3b  -->
    <extension url="http://hl7.org/fhir/StructureDefinition/valueset-expand-group">
      <extension url="code">
        <valueCode value="security"/>
      </extension>
      <extension url="member">
        <valueCode value="login"/>
      </extension>
      <extension url="member">
        <valueCode value="unknown"/>
      </extension>
    </extension>

    <system value="#hacked"/>
    <!--  include the codes from the code system, no hierarchy here  -->
    <concept>
      <code value="invalid"/>
    </concept>      
    <concept>
      <code value="structure"/>
    </concept>
    <concept>
      <code value="required"/>
    </concept>
    <concept>
      <code value="value"/>
    </concept>
    <concept>
      <code value="processing"/>
    </concept>
    <concept>
      <code value="duplicate"/>
    </concept>
    <concept>
      <code value="not-found"/>
    </concept>
    <concept>
      <code value="conflict"/>
    </concept>
    <concept>
      <code value="lock"/>
    </concept>
    <concept>
      <code value="exception"/>
    </concept>
    <concept>
      <code value="tbrottled"/>
    </concept>
    <concept>
      <code value="login"/>
    </concept>
    <concept>
      <code value="unknown"/>
    </concept>
  </include>
</compose>
<expansion>
              <identifier value="urn:uuid:42316ff8-2714-4680-9980-f37a6d1a71bc"/>
              <timestamp value="2018-07-20T23:14:07+10:00"/>

  <!--  snip identifier etc  -->
  <parameter> <!--  this expansion is for a UI  -->
    <name value="excludeNotForUI"/>
    <valueUri value="false"/> 
  </parameter>
  <!--  other parameters snipped for brevity  -->

  <!--  #1 most common  -->
  <contains>
    <!--  no system or code - it's not a concept at all  -->  
    <abstract value="true"/>                  
    <display value="(Most common)"/>
    <contains>
      <system value="http://hl7.org/fhir/hacked"/>
      <code value="login"/> 
      <display value="Login Required"/> 
    </contains>
    <contains>
      <system value="http://hl7.org/fhir/hacked"/>
      <code value="conflict"/> 
      <display value="Edit Version Conflict"/> 
    </contains>
  </contains>

  <!--  #2a processing  -->
  <contains>
    <system value="http://hl7.org/fhir/hacked"/>
    <code value="processing"/> 
    <display value="Processing Failure"/> 
    <contains>
      <system value="http://hl7.org/fhir/hacked"/>
      <code value="duplicate"/> 
      <display value="Duplicate"/> 
    </contains>
    <contains>
      <system value="http://hl7.org/fhir/hacked"/>
      <code value="not-found"/> 
      <display value="Not Found"/> 
    </contains>
  </contains>

  <!--  #2b invalid  -->
  <contains>
    <system value="http://hl7.org/fhir/hacked"/>
    <abstract value="true"/>
    <code value="invalid"/> 
    <display value="Invalid Content"/> 
    <contains>
      <system value="http://hl7.org/fhir/hacked"/>
      <code value="structure"/> 
      <display value="Structural Issue"/> 
    </contains>
    <contains>
      <system value="http://hl7.org/fhir/hacked"/>
      <code value="required"/> 
      <display value="Required element missing"/> 
    </contains>
    <contains>
      <system value="http://hl7.org/fhir/hacked"/>
      <code value="value"/> 
      <display value="Element value invalid"/> 
    </contains>
  </contains>

  <!--  #3a transient  -->
  <contains>
    <system value="http://hl7.org/fhir/hacked"/>
    <!--  
      this entry is not in the value set, but it was introduced as a grouper. 
      So it's labelled "abstract" : user cannot select it, but the code is provided
      to tie it back to the concept  -->
    <abstract value="true"/>
    <code value="transient"/> 
    <display value="Transient Issue"/> 
    <contains>
      <system value="http://hl7.org/fhir/hacked"/>
      <code value="lock-error"/> 
      <display value="Lock Error"/> 
    </contains>
    <contains>
      <system value="http://hl7.org/fhir/hacked"/>
      <code value="exception"/> 
      <display value="Exception"/> 
    </contains>
    <contains>
      <system value="http://hl7.org/fhir/hacked"/>
      <code value="throttled"/> 
      <display value="Throttled"/> 
    </contains>
  </contains>

  <!--  #3b security  -->
  <contains>
    <system value="http://hl7.org/fhir/hacked"/>
    <!--  it's abstract either way  -->
    <abstract value="true"/>
    <code value="security"/> 
    <display value="Security Problem"/> 
    <contains>
      <system value="http://hl7.org/fhir/hacked"/>
      <code value="login"/> 
      <display value="Login Required"/> 
    </contains>
    <contains>
      <system value="http://hl7.org/fhir/hacked"/>
      <code value="unknown"/> 
      <display value="Unknown User"/> 
    </contains>
  </contains>

<!--  the not UI expansion is 
  <contains>
    <system value="http://hl7.org/fhir/hacked"/>
    <abstract value="true"/>
    <code value="invalid"/> 
    <display value="Invalid Content"/> 
  </contains>
  <contains>
    <system value="http://hl7.org/fhir/hacked"/>
    <code value="structure"/> 
    <display value="Structural Issue"/> 
  </contains>
  <contains>
    <system value="http://hl7.org/fhir/hacked"/>
    <code value="required"/> 
    <display value="Required element missing"/> 
  </contains>
  <contains>
    <system value="http://hl7.org/fhir/hacked"/>
    <code value="value"/> 
    <display value="Element value invalid"/> 
  </contains>
  <contains>
    <system value="http://hl7.org/fhir/hacked"/>
    <code value="processing"/> 
    <display value="Processing Failure"/> 
  </contains>
  <contains>
    <system value="http://hl7.org/fhir/hacked"/>
    <code value="duplicate"/> 
    <display value="Duplicate"/> 
  </contains>
  <contains>
    <system value="http://hl7.org/fhir/hacked"/>
    <code value="not-found"/> 
    <display value="Not Found"/> 
  </contains>
  <contains>
    <system value="http://hl7.org/fhir/hacked"/>
    <code value="conflict"/> 
    <display value="Edit Version Conflict"/> 
  </contains>
  <contains>
    <system value="http://hl7.org/fhir/hacked"/>
    <code value="lock-error"/> 
    <display value="Lock Error"/> 
  </contains>
  <contains>
    <system value="http://hl7.org/fhir/hacked"/>
    <code value="exception"/> 
    <display value="Exception"/> 
  </contains>
  <contains>
    <system value="http://hl7.org/fhir/hacked"/>
    <code value="throttled"/> 
    <display value="Throttled"/> 
  </contains>  
  <contains>
    <system value="http://hl7.org/fhir/hacked"/>
    <code value="login"/> 
    <display value="Login Required"/> 
  </contains>
  <contains>
    <system value="http://hl7.org/fhir/hacked"/>
    <code value="unknown"/> 
    <display value="Unknown User"/> 
  </contains>
 -->
</expansion>

</ValueSet>