FHIR Chat · Element.id vs snapshots of subtypes of Element in FHIR 4.0.0 · implementers

Stream: implementers

Topic: Element.id vs snapshots of subtypes of Element in FHIR 4.0.0


view this post on Zulip Gabriel Bezerra (Feb 22 2019 at 15:25):

Dear all,

In FHIR 4.0.0, Element.id is defined by the following ElementDefinition:

        {
          "id" : "Element.id",
          "path" : "Element.id",
          "representation" : ["xmlAttr"],
          "short" : "Unique id for inter-element referencing",
          "definition" : "Unique id for the element within a resource (for internal references). This may be any string value that does
          "min" : 0,
          "max" : "1",
          "base" : {
            "path" : "Element.id",
            "min" : 0,
            "max" : "1"
          },
          "type" : [{
            "_code" : {
              "extension" : [{
                "url" : "http://hl7.org/fhir/StructureDefinition/structuredefinition-json-type",
                "valueString" : "string"
              },
              {
                "url" : "http://hl7.org/fhir/StructureDefinition/structuredefinition-xml-type",
                "valueString" : "xsd:string"
              },
              {
                "url" : "http://hl7.org/fhir/StructureDefinition/structuredefinition-rdf-type",
                "valueString" : "xsd:string"
              }]
            }
          }],
          "isModifier" : false,
          "isSummary" : false,
          "mapping" : [{
            "identity" : "rim",
            "map" : "n/a"
          }]
        },

However, when looking into subtypes of Element, one can find the StructureDefinitions have the following shape:

  {
    "fullUrl" : "http://hl7.org/fhir/StructureDefinition/BackboneElement",
    "resource" : {
      "resourceType" : "StructureDefinition",
      "id" : "BackboneElement",
      // ...
      "fhirVersion" : "4.0.0",
      // ...
      "kind" : "complex-type",
      "abstract" : true,
      "type" : "BackboneElement",
      "baseDefinition" : "http://hl7.org/fhir/StructureDefinition/Element",
      "derivation" : "specialization",
      "snapshot" : {
        "element" : [{
          "id" : "BackboneElement",
          // ...
        },
        {
          "id" : "BackboneElement.id",
          "path" : "BackboneElement.id",
          "representation" : ["xmlAttr"],
          "short" : "Unique id for inter-element referencing",
          "definition" : "Unique id for the element within a resource (for internal references). This may be any string value that does
          "min" : 0,
          "max" : "1",
          "base" : {
            "path" : "Element.id",
            "min" : 0,
            "max" : "1"
          },
          "type" : [{
            "code" : "string"
          }],
          "isModifier" : false,
          "isSummary" : false,
          "mapping" : [{
            "identity" : "rim",
            "map" : "n/a"
          }]
        },
        {
          "id" : "BackboneElement.extension",
          // ...
        },
        {
          "id" : "BackboneElement.modifierExtension",
          // ...
        }]
      },
      "differential" : {
        "element" : [{
          "id" : "BackboneElement",
          // ...
        },
        {
          "id" : "BackboneElement.modifierExtension",
          // ...
        }]
      }

...that is:
- differential does not pose any changes to the id field; and
- snapshot shows an id field whose type is completely different from the definition of the base Element.id.

It also happens with other Elements, like http://hl7.org/fhir/StructureDefinition/string, http://hl7.org/fhir/StructureDefinition/boolean etc.

What is the correct version: the one described by differential, or the one described by snapshot?

view this post on Zulip Gabriel Bezerra (Feb 25 2019 at 09:08):

@Grahame Grieve @Lloyd McKenzie -- you usually answer my questions in this regard, maybe you would be interested in this one ^

view this post on Zulip Michel Rutten (Feb 25 2019 at 12:09):

Hi @Gabriel Bezerra, looks like you found an error in the official snapshots.
For comparison, here's a fragment from an Observation snapshot, generated by the (R4) FHIR .NET API:

<element id="Observation.referenceRange.id">
    <path value="Observation.referenceRange.id" />
    <representation value="xmlAttr" />
    <short value="Unique id for inter-element referencing" />
    <definition value="Unique id for the element within a resource (for internal references). This may be any string value that does not contain spaces." />
    <min value="0" />
    <max value="1" />
    <base>
        <path value="Element.id" />
        <min value="0" />
        <max value="1" />
    </base>
    <type>
        <code>
            <extension url="http://hl7.org/fhir/StructureDefinition/structuredefinition-json-type">
                <valueString value="string" />
            </extension>
            <extension url="http://hl7.org/fhir/StructureDefinition/structuredefinition-xml-type">
                <valueString value="xsd:string" />
            </extension>
            <extension url="http://hl7.org/fhir/StructureDefinition/structuredefinition-rdf-type">
                <valueString value="xsd:string" />
            </extension>
        </code>
    </type>
    <mapping>
        <identity value="rim" />
        <map value="n/a" />
    </mapping>
</element>

In this example, you can see that the particular id child element inherits all the constraints (incl. special "compiler magic" extensions) from the Element.id' ElementDefinition node in the core Element` StructureDefinition.

view this post on Zulip Gabriel Bezerra (Feb 25 2019 at 12:19):

@Michel Rutten , yes. In that case, when they disagree, which one wins?

view this post on Zulip Michel Rutten (Feb 25 2019 at 12:22):

Malformed data is ambiguous, per definition. FHIR core resource & type definitions should be completely valid. I suggest that you submit a GForge ticket to correct this.

view this post on Zulip Michel Rutten (Feb 25 2019 at 12:23):

In general, a derived profile is only allowed to further constrain the base profile; it is certainly not valid to replace an element type with another, incompatible type.

view this post on Zulip Gabriel Bezerra (Feb 25 2019 at 13:16):

Ticket submitted in GForge: https://gforge.hl7.org/gf/project/fhir/tracker/?action=TrackerItemEdit&tracker_item_id=20465

view this post on Zulip Grahame Grieve (Feb 25 2019 at 23:23):

I'll add it to my list


Last updated: Apr 12 2022 at 19:14 UTC