SMART Base
0.1.0 - ci-build

SMART Base, published by WHO. This guide is not an authorized publication; it is the continuous build for version 0.1.0 built by the FHIR (HL7® FHIR® Standard) CI Build. This version is based on the current content of https://github.com/WorldHealthOrganization/smart-base/ and changes regularly. See the Directory of published versions

Resource Profile: SMART Guidelines Logical Model

Official URL: http://smart.who.int/base/StructureDefinition/SGLogicalModel Version: 0.1.0
Draft as of 2025-03-31 Computable Name: SGLogicalModel

Defines the minimum expectations for Logical Models used in SMART Guidelines

Usage:

Formal Views of Profile Content

Description of Profiles, Differentials, Snapshots and how the different presentations work.

NameFlagsCard.TypeDescription & Constraintsdoco
.. StructureDefinition C 0..* StructureDefinition Structural Definition
dom-2: If the resource is contained in another resource, it SHALL NOT contain nested Resources
dom-3: If the resource is contained in another resource, it SHALL be referred to from elsewhere in the resource or SHALL refer to the containing resource
dom-4: If a resource is contained in another resource, it SHALL NOT have a meta.versionId or a meta.lastUpdated
dom-5: If a resource is contained in another resource, it SHALL NOT have a security label
dom-6: A resource should have narrative for robust management
sdf-0: Name should be usable as an identifier for the module by machine processing applications such as code generation
sdf-1: Element paths must be unique unless the structure is a constraint
sdf-15a: If the first element in a differential has no "." in the path and it's not a logical model, it has no type
sdf-4: If the structure is not abstract, then there SHALL be a baseDefinition
sdf-5: If the structure defines an extension then the structure must have context information
sdf-6: A structure must have either a differential, or a snapshot (or both)
sdf-9: In any snapshot or differential, no label, code or requirements on an element without a "." in the path (e.g. the first element)
sdf-11: If there's a type, its content must match the path name in the first element of a snapshot
sdf-14: All element definitions must have an id
sdf-15: The first element in a snapshot has no type unless model is a logical model.
sdf-16: All element definitions must have unique ids (snapshot)
sdf-17: All element definitions must have unique ids (diff)
sdf-18: Context Invariants can only be used for extensions
sdf-19: FHIR Specification models only use FHIR defined types
sdf-21: Default values can only be specified on specializations
sdf-22: FHIR Specification models never have default values
sdf-23: No slice name on root
... implicitRules ?!Σ 0..1 uri A set of rules under which this content was created
ele-1: All FHIR elements must have a @value or children
... modifierExtension ?! 0..* Extension Extensions that cannot be ignored
ele-1: All FHIR elements must have a @value or children
ext-1: Must have either extensions or value[x], not both
... url Σ 1..1 uri Canonical identifier for this structure definition, represented as a URI (globally unique)
ele-1: All FHIR elements must have a @value or children
... title Σ 1..1 string Name for this structure definition (human friendly)
ele-1: All FHIR elements must have a @value or children
... status ?!Σ 1..1 code draft | active | retired | unknown
Binding: PublicationStatus (required): The lifecycle status of an artifact.


ele-1: All FHIR elements must have a @value or children
... publisher Σ 1..1 string Name of the publisher (organization or individual)
ele-1: All FHIR elements must have a @value or children
... description 1..1 markdown Natural language description of the structure definition
ele-1: All FHIR elements must have a @value or children
... kind Σ 1..1 code primitive-type | complex-type | resource | logical
Binding: StructureDefinitionKind (required): Defines the type of structure that a definition is describing.


ele-1: All FHIR elements must have a @value or children
Required Pattern: logical
... abstract Σ 1..1 boolean Whether the structure is abstract
ele-1: All FHIR elements must have a @value or children
... type ΣC 1..1 uri Type defined or constrained by this structure
Binding: FHIRDefinedType (extensible): Either a resource or a data type, including logical model types.


ele-1: All FHIR elements must have a @value or children
... differential C 0..1 BackboneElement Differential view of the structure
ele-1: All FHIR elements must have a @value or children
sdf-20: No slicing on the root element
sdf-8a: In any differential, all the elements must start with the StructureDefinition's specified type for non-logical models, or with the same type name for logical models
.... modifierExtension ?!Σ 0..* Extension Extensions that cannot be ignored even if unrecognized
ele-1: All FHIR elements must have a @value or children
ext-1: Must have either extensions or value[x], not both
.... element 1..* ElementDefinition Definition of elements in the resource (if no StructureDefinition)
ele-1: All FHIR elements must have a @value or children
..... modifierExtension ?!Σ 0..* Extension Extensions that cannot be ignored even if unrecognized
ele-1: All FHIR elements must have a @value or children
ext-1: Must have either extensions or value[x], not both
..... path Σ 1..1 string Path of the element in the hierarchy of elements
ele-1: All FHIR elements must have a @value or children
..... Slices for code Σ 1..* Coding Corresponding codes in terminologies
Slice: Unordered, Open by pattern:system
Binding: LOINCCodes (example): Codes that indicate the meaning of a data element.


ele-1: All FHIR elements must have a @value or children
...... code:smart SΣ 1..1 Coding Corresponding codes in terminologies
Binding: LOINCCodes (example): Codes that indicate the meaning of a data element.


ele-1: All FHIR elements must have a @value or children
....... system Σ 1..1 uri Identity of the terminology system
ele-1: All FHIR elements must have a @value or children
Required Pattern: http://who.smart.codes/smart
...... code:loinc SΣ 0..1 Coding Corresponding codes in terminologies
Binding: LOINCCodes (example): Codes that indicate the meaning of a data element.


ele-1: All FHIR elements must have a @value or children
....... system Σ 1..1 uri Identity of the terminology system
ele-1: All FHIR elements must have a @value or children
Required Pattern: http://who.smart.codes/loinc
...... code:snomed SΣ 0..1 Coding Corresponding codes in terminologies
Binding: LOINCCodes (example): Codes that indicate the meaning of a data element.


ele-1: All FHIR elements must have a @value or children
....... system Σ 1..1 uri Identity of the terminology system
ele-1: All FHIR elements must have a @value or children
Required Pattern: http://who.smart.codes/snomed
...... code:icd-10 SΣ 0..1 Coding Corresponding codes in terminologies
Binding: LOINCCodes (example): Codes that indicate the meaning of a data element.


ele-1: All FHIR elements must have a @value or children
....... system Σ 1..1 uri Identity of the terminology system
ele-1: All FHIR elements must have a @value or children
Required Pattern: http://who.smart.codes/icd-10
...... code:icd-11 SΣ 0..1 Coding Corresponding codes in terminologies
Binding: LOINCCodes (example): Codes that indicate the meaning of a data element.


ele-1: All FHIR elements must have a @value or children
....... system Σ 1..1 uri Identity of the terminology system
ele-1: All FHIR elements must have a @value or children
Required Pattern: http://who.smart.codes/icd-11
...... code:icf SΣ 0..1 Coding Corresponding codes in terminologies
Binding: LOINCCodes (example): Codes that indicate the meaning of a data element.


ele-1: All FHIR elements must have a @value or children
....... system Σ 1..1 uri Identity of the terminology system
ele-1: All FHIR elements must have a @value or children
Required Pattern: http://who.smart.codes/icf
...... code:ichi SΣ 0..1 Coding Corresponding codes in terminologies
Binding: LOINCCodes (example): Codes that indicate the meaning of a data element.


ele-1: All FHIR elements must have a @value or children
....... system Σ 1..1 uri Identity of the terminology system
ele-1: All FHIR elements must have a @value or children
Required Pattern: http://who.smart.codes/ichi
...... code:snomed-gps SΣ 0..1 Coding Corresponding codes in terminologies
Binding: LOINCCodes (example): Codes that indicate the meaning of a data element.


ele-1: All FHIR elements must have a @value or children
....... system Σ 1..1 uri Identity of the terminology system
ele-1: All FHIR elements must have a @value or children
Required Pattern: http://who.smart.codes/smart-gps
...... code:atc SΣ 0..1 Coding Corresponding codes in terminologies
Binding: LOINCCodes (example): Codes that indicate the meaning of a data element.


ele-1: All FHIR elements must have a @value or children
....... system Σ 1..1 uri Identity of the terminology system
ele-1: All FHIR elements must have a @value or children
Required Pattern: http://who.smart.codes/atc
..... short Σ 1..1 string Concise definition for space-constrained presentation
ele-1: All FHIR elements must have a @value or children
..... definition Σ 1..1 markdown Full formal definition as narrative text
ele-1: All FHIR elements must have a @value or children
..... max ΣC 0..1 string Maximum Cardinality (a number or *)
eld-3: Max SHALL be a number or "*"
ele-1: All FHIR elements must have a @value or children
..... type ΣC 1..1 Element Data type and Profile for this element
eld-4: Aggregation may only be specified if one of the allowed types for the element is a reference
eld-17: targetProfile is only allowed if the type is Reference or canonical
ele-1: All FHIR elements must have a @value or children
...... code Σ 1..1 uri Data type or Resource (reference to definition)
Binding: FHIRDefinedType (extensible): Either a resource or a data type, including logical model types.


ele-1: All FHIR elements must have a @value or children
..... fixed[x] ΣC 0..1 Value must be exactly this
ele-1: All FHIR elements must have a @value or children
...... fixedBase64Binary base64Binary
...... fixedBoolean boolean
...... fixedCanonical canonical(Any)
...... fixedCode code
...... fixedDate date
...... fixedDateTime dateTime
...... fixedDecimal decimal
...... fixedId id
...... fixedInstant instant
...... fixedInteger integer
...... fixedMarkdown markdown
...... fixedOid oid
...... fixedPositiveInt positiveInt
...... fixedString string
...... fixedTime time
...... fixedUnsignedInt unsignedInt
...... fixedUri uri
...... fixedUrl url
...... fixedUuid uuid
...... fixedAddress Address
...... fixedAge Age
...... fixedAnnotation Annotation
...... fixedAttachment Attachment
...... fixedCodeableConcept CodeableConcept
...... fixedCoding Coding
...... fixedContactPoint ContactPoint
...... fixedCount Count
...... fixedDistance Distance
...... fixedDuration Duration
...... fixedHumanName HumanName
...... fixedIdentifier Identifier
...... fixedMoney Money
...... fixedPeriod Period
...... fixedQuantity Quantity
...... fixedRange Range
...... fixedRatio Ratio
...... fixedReference Reference(Any)
...... fixedSampledData SampledData
...... fixedSignature Signature
...... fixedTiming Timing
...... fixedContactDetail ContactDetail
...... fixedContributor Contributor
...... fixedDataRequirement DataRequirement
...... fixedExpression Expression
...... fixedParameterDefinition ParameterDefinition
...... fixedRelatedArtifact RelatedArtifact
...... fixedTriggerDefinition TriggerDefinition
...... fixedUsageContext UsageContext
...... fixedDosage Dosage
...... fixedMeta Meta
..... pattern[x] ΣC 0..1 Value must have at least these property values
ele-1: All FHIR elements must have a @value or children
...... patternBase64Binary base64Binary
...... patternBoolean boolean
...... patternCanonical canonical(Any)
...... patternCode code
...... patternDate date
...... patternDateTime dateTime
...... patternDecimal decimal
...... patternId id
...... patternInstant instant
...... patternInteger integer
...... patternMarkdown markdown
...... patternOid oid
...... patternPositiveInt positiveInt
...... patternString string
...... patternTime time
...... patternUnsignedInt unsignedInt
...... patternUri uri
...... patternUrl url
...... patternUuid uuid
...... patternAddress Address
...... patternAge Age
...... patternAnnotation Annotation
...... patternAttachment Attachment
...... patternCodeableConcept CodeableConcept
...... patternCoding Coding
...... patternContactPoint ContactPoint
...... patternCount Count
...... patternDistance Distance
...... patternDuration Duration
...... patternHumanName HumanName
...... patternIdentifier Identifier
...... patternMoney Money
...... patternPeriod Period
...... patternQuantity Quantity
...... patternRange Range
...... patternRatio Ratio
...... patternReference Reference(Any)
...... patternSampledData SampledData
...... patternSignature Signature
...... patternTiming Timing
...... patternContactDetail ContactDetail
...... patternContributor Contributor
...... patternDataRequirement DataRequirement
...... patternExpression Expression
...... patternParameterDefinition ParameterDefinition
...... patternRelatedArtifact RelatedArtifact
...... patternTriggerDefinition TriggerDefinition
...... patternUsageContext UsageContext
...... patternDosage Dosage
...... patternMeta Meta

doco Documentation for this format

Terminology Bindings

PathConformanceValueSet / CodeURI
StructureDefinition.statusrequiredPublicationStatus
http://hl7.org/fhir/ValueSet/publication-status|4.0.1
from the FHIR Standard
StructureDefinition.kindrequiredPattern: logical
http://hl7.org/fhir/ValueSet/structure-definition-kind|4.0.1
from the FHIR Standard
StructureDefinition.typeextensibleFHIRDefinedType
http://hl7.org/fhir/ValueSet/defined-types
from the FHIR Standard
StructureDefinition.differential.element.codeexampleLOINCCodes (a valid code from LOINC)
http://hl7.org/fhir/ValueSet/observation-codes
from the FHIR Standard
StructureDefinition.differential.element.code:smartexampleLOINCCodes (a valid code from LOINC)
http://hl7.org/fhir/ValueSet/observation-codes
from the FHIR Standard
StructureDefinition.differential.element.code:loincexampleLOINCCodes (a valid code from LOINC)
http://hl7.org/fhir/ValueSet/observation-codes
from the FHIR Standard
StructureDefinition.differential.element.code:snomedexampleLOINCCodes (a valid code from LOINC)
http://hl7.org/fhir/ValueSet/observation-codes
from the FHIR Standard
StructureDefinition.differential.element.code:icd-10exampleLOINCCodes (a valid code from LOINC)
http://hl7.org/fhir/ValueSet/observation-codes
from the FHIR Standard
StructureDefinition.differential.element.code:icd-11exampleLOINCCodes (a valid code from LOINC)
http://hl7.org/fhir/ValueSet/observation-codes
from the FHIR Standard
StructureDefinition.differential.element.code:icfexampleLOINCCodes (a valid code from LOINC)
http://hl7.org/fhir/ValueSet/observation-codes
from the FHIR Standard
StructureDefinition.differential.element.code:ichiexampleLOINCCodes (a valid code from LOINC)
http://hl7.org/fhir/ValueSet/observation-codes
from the FHIR Standard
StructureDefinition.differential.element.code:snomed-gpsexampleLOINCCodes (a valid code from LOINC)
http://hl7.org/fhir/ValueSet/observation-codes
from the FHIR Standard
StructureDefinition.differential.element.code:atcexampleLOINCCodes (a valid code from LOINC)
http://hl7.org/fhir/ValueSet/observation-codes
from the FHIR Standard
StructureDefinition.differential.element.type.codeextensibleFHIRDefinedType
http://hl7.org/fhir/ValueSet/defined-types
from the FHIR Standard

Constraints

IdGradePath(s)DetailsRequirements
dom-2errorStructureDefinitionIf the resource is contained in another resource, it SHALL NOT contain nested Resources
: contained.contained.empty()
dom-3errorStructureDefinitionIf the resource is contained in another resource, it SHALL be referred to from elsewhere in the resource or SHALL refer to the containing resource
: contained.where((('#'+id in (%resource.descendants().reference | %resource.descendants().as(canonical) | %resource.descendants().as(uri) | %resource.descendants().as(url))) or descendants().where(reference = '#').exists() or descendants().where(as(canonical) = '#').exists() or descendants().where(as(canonical) = '#').exists()).not()).trace('unmatched', id).empty()
dom-4errorStructureDefinitionIf a resource is contained in another resource, it SHALL NOT have a meta.versionId or a meta.lastUpdated
: contained.meta.versionId.empty() and contained.meta.lastUpdated.empty()
dom-5errorStructureDefinitionIf a resource is contained in another resource, it SHALL NOT have a security label
: contained.meta.security.empty()
dom-6best practiceStructureDefinitionA resource should have narrative for robust management
: text.`div`.exists()
ele-1error**ALL** elementsAll FHIR elements must have a @value or children
: hasValue() or (children().count() > id.count())
eld-3errorStructureDefinition.differential.element.maxMax SHALL be a number or "*"
: empty() or ($this = '*') or (toInteger() >= 0)
eld-4errorStructureDefinition.differential.element.typeAggregation may only be specified if one of the allowed types for the element is a reference
: aggregation.empty() or (code = 'Reference') or (code = 'canonical')
eld-17errorStructureDefinition.differential.element.typetargetProfile is only allowed if the type is Reference or canonical
: (code='Reference' or code = 'canonical') or targetProfile.empty()
ext-1error**ALL** extensionsMust have either extensions or value[x], not both
: extension.exists() != value.exists()
sdf-0warningStructureDefinitionName should be usable as an identifier for the module by machine processing applications such as code generation
: name.matches('[A-Z]([A-Za-z0-9_]){0,254}')
sdf-1errorStructureDefinitionElement paths must be unique unless the structure is a constraint
: derivation = 'constraint' or snapshot.element.select(path).isDistinct()
sdf-4errorStructureDefinitionIf the structure is not abstract, then there SHALL be a baseDefinition
: abstract = true or baseDefinition.exists()
Ensure that the base types are abstract
sdf-5errorStructureDefinitionIf the structure defines an extension then the structure must have context information
: type != 'Extension' or derivation = 'specialization' or (context.exists())
sdf-6errorStructureDefinitionA structure must have either a differential, or a snapshot (or both)
: snapshot.exists() or differential.exists()
sdf-9errorStructureDefinitionIn any snapshot or differential, no label, code or requirements on an element without a "." in the path (e.g. the first element)
: children().element.where(path.contains('.').not()).label.empty() and children().element.where(path.contains('.').not()).code.empty() and children().element.where(path.contains('.').not()).requirements.empty()
Because these 3 fields seem to be have overlapping meaning with the ones in the root of StructureDefinition
sdf-11errorStructureDefinitionIf there's a type, its content must match the path name in the first element of a snapshot
: kind != 'logical' implies snapshot.empty() or snapshot.element.first().path = type
Ensure that the type is not inconsistent with the other information in the structure
sdf-14errorStructureDefinitionAll element definitions must have an id
: snapshot.element.all(id.exists()) and differential.element.all(id.exists())
elements have id
sdf-15errorStructureDefinitionThe first element in a snapshot has no type unless model is a logical model.
: kind!='logical' implies snapshot.element.first().type.empty()
No Type on the root element (snapshot)
sdf-15aerrorStructureDefinitionIf the first element in a differential has no "." in the path and it's not a logical model, it has no type
: (kind!='logical' and differential.element.first().path.contains('.').not()) implies differential.element.first().type.empty()
No Type on the root element (differential)
sdf-16errorStructureDefinitionAll element definitions must have unique ids (snapshot)
: snapshot.element.all(id.exists()) and snapshot.element.id.trace('ids').isDistinct()
element ids need to be unique
sdf-17errorStructureDefinitionAll element definitions must have unique ids (diff)
: differential.element.all(id.exists()) and differential.element.id.trace('ids').isDistinct()
element ids need to be unique
sdf-18errorStructureDefinitionContext Invariants can only be used for extensions
: contextInvariant.exists() implies type = 'Extension'
contextInvariant
sdf-19errorStructureDefinitionFHIR Specification models only use FHIR defined types
: url.startsWith('http://hl7.org/fhir/StructureDefinition') implies (differential.element.type.code.all(matches('^[a-zA-Z0-9]+$') or matches('^http:\\/\\/hl7\\.org\\/fhirpath\\/System\\.[A-Z][A-Za-z]+$')) and snapshot.element.type.code.all(matches('^[a-zA-Z0-9\\.]+$') or matches('^http:\\/\\/hl7\\.org\\/fhirpath\\/System\\.[A-Z][A-Za-z]+$')))
custom types only in logical models
sdf-20errorStructureDefinition.differentialNo slicing on the root element
: element.where(path.contains('.').not()).slicing.empty()
no slicing on root
sdf-21errorStructureDefinitionDefault values can only be specified on specializations
: differential.element.defaultValue.exists() implies (derivation = 'specialization')
no default values on data types or resources
sdf-22errorStructureDefinitionFHIR Specification models never have default values
: url.startsWith('http://hl7.org/fhir/StructureDefinition') implies (snapshot.element.defaultValue.empty() and differential.element.defaultValue.empty())
no default values on data types or resources
sdf-23errorStructureDefinitionNo slice name on root
: (snapshot | differential).element.all(path.contains('.').not() implies sliceName.empty())
no sliceName on root
sdf-8aerrorStructureDefinition.differentialIn any differential, all the elements must start with the StructureDefinition's specified type for non-logical models, or with the same type name for logical models
: (%resource.kind = 'logical' or element.first().path.startsWith(%resource.type)) and (element.tail().empty() or element.tail().all(path.startsWith(%resource.differential.element.first().path.replaceMatches('\\..*','')&'.')))

 

Other representations of profile: CSV, Excel, Schematron