A Questionnaire is a structured set of questions intended to guide the collection of answers from end-users. Questionnaires provide detailed control over order, presentation, phraseology and grouping to allow coherent, consistent data collection.
In the eHealth Infrastructure the Questionnaire resource is used in line with this. Questionnaires are built and maintained by Practitioners and presented to Patients by client applications in order to gather input and answers from Patients in the form of QuestionnaireResponse resources.
A question where possible answers are given as a list of options (of item.type
set to choice
) can allow multiple choices by setting item.repeats
to true
. When no further constraints are set, item.repeats
set to true
means that any number of the options can be provided as answer to the question in a QuestionnaireResponse. The standard extensions item.questionnaire-minOccurs
and item.questionnaire-maxOccurs
can be used to set such further constraints.
item.questionnaire-minOccurs
sets the minimum number of answers allowed, for instance 2 (of the number of options, say, 5). The element shall be set only when its value is greater than one.item.questionnaire-maxOccurs
sets the maximum number of answers allowed, for instance 3 (of the number of options, say 5). The element shall be set only when its value is greater than one.When exactly one answer shall be required, item.requied
shall be set to true
and item.repeats
shall be set to false
. When exactly one answer is permitted, item.requied
shall be set to false
and item.repeats
shall be set to false
. In these cases, the minOCcurs
and maxOccurs
shall not be used.
The Questionnaire resource supports the Question Feedback Pattern from DK QFDD questionnaires. This enables immediate feedback to the patient upon answering a question.
The feedback is pre-defined in the Questionnaire resource using the item.feedback
element, so that for each item a patient feedback can be prepared. The feedback will be shown to the patient if the patient’s answer to an item lies within a given interval. The mechanism only works for questions which can be answered with a numeric value. The interval is defined by the min
and a max
elements of the feedback extension. If the Patient answers the item with a numeric value in the interval given by min-max then the value
of the feedback extension is intended to be shown to the Patient.
In the recommendation
element, a questionnaire can optionally hold a “degree of recommendation” intended to aid the Practitioner in deciding whether or not the Questionnaire should be applied to the Patient.
The official URL for this profile is:
http://ehealth.sundhed.dk/fhir/StructureDefinition/ehealth-questionnaire
This profile builds on Questionnaire.
This profile was published on Tue Oct 27 14:11:48 UTC 2020 as a draft by ehealth.sundhed.dk.
Description of Profiles, Differentials, Snapshots, and how the XML and JSON presentations work.
Path | Conformance | ValueSet |
Questionnaire.language | extensible | Common Languages Max Binding: All Languages |
Questionnaire.status | required | PublicationStatus |
Questionnaire.jurisdiction | extensible | Jurisdiction |
Questionnaire.code | example | Questionnaire Question Codes |
Questionnaire.subjectType | required | ResourceType |
Questionnaire.item.code | example | Questionnaire Question Codes |
Questionnaire.item.type | required | QuestionnaireItemType |
Questionnaire.item.enableWhen.answer[x] | example | Questionnaire Answer Codes |
Questionnaire.item.option.value[x] | example | Questionnaire Answer Codes |
Questionnaire.item.initial[x] | example | Questionnaire Answer Codes |
Id | Path | Details | Requirements |
dom-2 | Questionnaire | If the resource is contained in another resource, it SHALL NOT contain nested Resources : contained.contained.empty() | |
dom-1 | Questionnaire | If the resource is contained in another resource, it SHALL NOT contain any narrative : contained.text.empty() | |
dom-4 | Questionnaire | If 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-3 | Questionnaire | If the resource is contained in another resource, it SHALL be referred to from elsewhere in the resource : contained.where(('#'+id in %resource.descendants().reference).not()).empty() | |
que-2 | Questionnaire | The link ids for groups and questions must be unique within the questionnaire : descendants().linkId.isDistinct() | |
ele-1 | Questionnaire.extension:recommendation | All FHIR elements must have a @value or children : hasValue() | (children().count() > id.count()) | |
ext-1 | Questionnaire.extension:recommendation | Must have either extensions or value[x], not both : extension.exists() != value.exists() | |
ele-1 | Questionnaire.extension:intendedOrganization | All FHIR elements must have a @value or children : hasValue() | (children().count() > id.count()) | |
ext-1 | Questionnaire.extension:intendedOrganization | Must have either extensions or value[x], not both : extension.exists() != value.exists() | |
ele-1 | Questionnaire.extension:revision | All FHIR elements must have a @value or children : hasValue() | (children().count() > id.count()) | |
ext-1 | Questionnaire.extension:revision | Must have either extensions or value[x], not both : extension.exists() != value.exists() | |
ele-1 | Questionnaire.extension:modifierRole | All FHIR elements must have a @value or children : hasValue() | (children().count() > id.count()) | |
ext-1 | Questionnaire.extension:modifierRole | Must have either extensions or value[x], not both : extension.exists() != value.exists() | |
ele-1 | Questionnaire.extension:type | All FHIR elements must have a @value or children : hasValue() | (children().count() > id.count()) | |
ext-1 | Questionnaire.extension:type | Must have either extensions or value[x], not both : extension.exists() != value.exists() | |
ele-1 | Questionnaire.item | All FHIR elements must have a @value or children : hasValue() | (children().count() > id.count()) | |
que-9 | Questionnaire.item | Read-only can't be specified for "display" items : type!='display' or readOnly.empty() | |
que-8 | Questionnaire.item | Default values can't be specified for groups or display items : (type!='group' and type!='display') or initial.empty() | |
que-6 | Questionnaire.item | Required and repeat aren't permitted for display items : type!='display' or (required.empty() and repeats.empty()) | |
que-5 | Questionnaire.item | Only 'choice' items can have options : (type ='choice' or type = 'open-choice') or (options.empty() and option.empty()) | |
que-4 | Questionnaire.item | A question cannot have both option and options : option.empty() or options.empty() | |
que-3 | Questionnaire.item | Display items cannot have a "code" asserted : type!='display' or code.empty() | |
que-10 | Questionnaire.item | Maximum length can only be declared for simple question types : (type in ('boolean' | 'decimal' | 'integer' | 'string' | 'text' | 'url')) or maxLength.empty() | |
que-1 | Questionnaire.item | Group items must have nested items, display items cannot have nested items : (type='group' implies item.empty().not()) and (type.trace('type')='display' implies item.trace('item').empty()) | |
ele-1 | Questionnaire.item.extension:minOccurs | All FHIR elements must have a @value or children : hasValue() | (children().count() > id.count()) | |
ext-1 | Questionnaire.item.extension:minOccurs | Must have either extensions or value[x], not both : extension.exists() != value.exists() | |
ele-1 | Questionnaire.item.extension:feedback | All FHIR elements must have a @value or children : hasValue() | (children().count() > id.count()) | |
ext-1 | Questionnaire.item.extension:feedback | Must have either extensions or value[x], not both : extension.exists() != value.exists() | |
ele-1 | Questionnaire.item.extension:maxOccurs | All FHIR elements must have a @value or children : hasValue() | (children().count() > id.count()) | |
ext-1 | Questionnaire.item.extension:maxOccurs | Must have either extensions or value[x], not both : extension.exists() != value.exists() | |
ele-1 | Questionnaire.item.extension:minValue | All FHIR elements must have a @value or children : hasValue() | (children().count() > id.count()) | |
ext-1 | Questionnaire.item.extension:minValue | Must have either extensions or value[x], not both : extension.exists() != value.exists() | |
ele-1 | Questionnaire.item.extension:maxValue | All FHIR elements must have a @value or children : hasValue() | (children().count() > id.count()) | |
ext-1 | Questionnaire.item.extension:maxValue | Must have either extensions or value[x], not both : extension.exists() != value.exists() | |
ele-1 | Questionnaire.item.extension:slidingStepValue | All FHIR elements must have a @value or children : hasValue() | (children().count() > id.count()) | |
ext-1 | Questionnaire.item.extension:slidingStepValue | Must have either extensions or value[x], not both : extension.exists() != value.exists() | |
ele-1 | Questionnaire.item.extension:overviewUsageMode | All FHIR elements must have a @value or children : hasValue() | (children().count() > id.count()) | |
ext-1 | Questionnaire.item.extension:overviewUsageMode | Must have either extensions or value[x], not both : extension.exists() != value.exists() | |
ele-1 | Questionnaire.item.enableWhen | All FHIR elements must have a @value or children : hasValue() | (children().count() > id.count()) | |
que-7 | Questionnaire.item.enableWhen | enableWhen must contain either a 'answer' or a 'hasAnswer' element : hasAnswer.exists() xor answer.exists() | |
ele-1 | Questionnaire.item.option | All FHIR elements must have a @value or children : hasValue() | (children().count() > id.count()) |