Query, Retrieve and Transform Documents from NSP
The eHealth Infrastructure document-query and document-transformation services provide integrations to the Danish national document-sharing infrastructure.
This page describes the eHealth infrastructure capabilities for
How to query and retrieve documents from NSP
How to upload CDA documents to NSP
Details on transformations FHIR to CDA Document
Details on transformations CDA Document to FHIR
Content
The national document-sharing infrastructure is based on Integrating the Health Enterprise (IHE) Cross-enterprise Document Sharing (XDS-b) profiles and uses Danish profiles for document metadata. While XDS-b is content-agnostic, currently shared documents are XML documents (ideally) adhering to Danish profiles of Clinical Document Architecture (CDA) document types.
Queries for document metadata and retrieval of documents can be performed through the healthcare domain National Service Platform (NSP) Document Sharing Service (Danish: Dokumentdelingsservice DDS). Acting as a front, the DDS encapsulates details about the topology of XDS-b components, whether this is one or more XDS Registry containing document metadata or one or more XDS Repository containing documents.
The eHealth Infrastructure:
Performs registering of measurement data to the KIH XDS Repository (see Registering of documents)
Performs registering of appointments to the XDS Repository fronted by NSP Document Registering and Update Service (see Registering of documents)
Provides a FHIR wrapping for performing querying for document metadata and retrieving documents on the NSP DDS (see Performing Document Query and Document Retrieve below)
The eHealth Infrastructure provides operations to transform between FHIR resources and Danish profiles of Clinical Document Architecture (CDA) XML documents.
The transformations to CDA documents are used (see details below) when the eHealth infrastructure uploads documents and metadata to the national document-sharing infrastructure.
The transformations to FHIR resources can be used by a client performing XDS-b document metadata query and document retrieving.
Services to perform Document Query and Document Retrieve
The Danish National Service Platform (NSP) in Healthcare provides a national document-sharing service (Danish: Dokumentdelingsservice DDS).
The DDS provides the following operations described in https://profiles.ihe.net/ITI/TF/Volume1/ch-10.html:
The Registry Stored Query (XDS-b transaction ITI-18) lets you search for document metadata using criteria like patient ID and period. It returns matching results, which could be none, one, or more.
The Retrieve Document Set (XDS-b transaction ITI-43) allows you to get documents based on their metadata. It returns the documents, which could be none, one, or more.
Further details on how the NSP DDS processes ITI-18 and ITI-43 requests, including possibly withholding data due to patient’s consent (Danish: Min Spærring) are described in Danish at https://www.nspop.dk/x/WJC6.
These operations are supported through the following eHealth infrastructure operations provided by the document-query service:
DocumentReference?<query>
see https://ehealth.sundhed.dk/fhir/ehealth-documentreference-search.htmlBinary/$retrieve-document
return document as CDA. See https://ehealth.sundhed.dk/fhir/OperationDefinition-Binary-t-retrieve-document.htmlBinary/$retrieve-and-transform-QRD
return document as FHIR resource. See https://ehealth.sundhed.dk/fhir/OperationDefinition-Bundle-t-retrieve-and-transform-QRD.html. This operation is a little special as it requires QFDD to be present in the infrastructure and the corresponding FHIR Questionnaire. See below.Binary/$retrieve-and-transform-PHMR
return document as FHIR resource. See https://ehealth.sundhed.dk/fhir/OperationDefinition-Bundle-t-retrieve-and-transform-PHMR.htmlBinary/$retrieve-and-transform-APD
return document as FHIR resource. See https://ehealth.sundhed.dk/fhir/OperationDefinition-Bundle-t-retrieve-and-transform-APD.html
Querying document metadata is a necessary step before retrieving the actual document.
While the XDS-b transaction ITI-43 Retrieve Document Set supports the retrieval of multiple documents, the $retrieve-document
supports the retrieval of a single document only.
Special notes on retrieve-and-transform-QRD operation
The retrieval and transformation are offered as a single call via operations (one per document type).
The retrieve-and-transform-QRD operation is a little special as it requires QFDD to be present in the infrastructure and the corresponding FHIR Questionnaire.
Prerequisites:
The QFDD is uploaded to the infrastructure (e.g., via KAM), and the infrastructure has stored the QFDD in an FHIR DocumentReference.
The FHIR Questionnaire:
is an analogue (or close match) to the QFDD
has QFDD document ID as an identifier.
Client Applications must:
Look up metadata for the QRD for specific QFDD (via document query and DocumentReference Search)
Retrieve the FHIR Questionnaire from the Questionnaire service with the identifier of the QFDD document ID
Call Retrieve and transform QRD providing the URL for the CDA document and the FHIR Questionnaire as input (optional)
The Document-query service returns the FHIR QuestionnaireResponse if the FHIR Questionnaire is provided as input and the transformation is successful. Otherwise, it returns the QRD CDA XML.
Transformations Operations between FHIR resources and Danish CDA Profiles
The https://ehealth.sundhed.dk/fhir/CapabilityStatement-document-transformation.html provides operations for transforming documents between FHIR Resources and Danish CDA Profiles.
Details on the transformations are provided in the table below, which includes references to Danish CDA profiles.
The transformations have the following characteristics:
The transformations are idempotent (except for generated identifiers such as the CDA document ID in the output).
The transformations do not provide access to any FHIR resources. Client Applications must supply the necessary FHIR resources as input. This design prevents security breaches.
Transformation | Source (XML document in FHIR DocumentReference) | Target (XML document in FHIR DocumentReference) | Comment |
---|---|---|---|
https://ehealth.sundhed.dk/fhir/OperationDefinition--s-transform-to-PHMR.html | Bundle of FHIR resources. The primary source of information is a FHIR Observation. | PHMR v1.3 XML document.
| Used in assembly, transformation and upload of FHIR Observation transformed to PHMR to XDS-based document sharing infrastructure as described in Sharing through Registering Documents in National Document Sharing Infrastructure. |
https://ehealth.sundhed.dk/fhir/OperationDefinition--s-transform-to-QRD.html
| Bundle of FHIR resources. The primary source of information is an FHIR QuestionnaireResponse. | QRD v1.3 XML document | Used in assembly, transformation and upload of FHIR QuestionnaireResponse transformed to QRD to XDS-based document sharing infrastructure as described in Sharing through Registering Documents in National Document Sharing Infrastructure. |
https://ehealth.sundhed.dk/fhir/OperationDefinition--s-transform-to-QFDD.html | Bundle of FHIR resources. The primary source of information is the FHIR Questionnaire. | QFDD v1.2 XML document |
|
https://ehealth.sundhed.dk/fhir/OperationDefinition--s-transform-to-APD.html | Bundle of FHIR resources. The primary source of information is a FHIR Appointment. | APD v2.0 XML document | Used in assembly, transformation and upload of FHIR Appointment transformed to APD to XDS-based document sharing infrastructure as described in Sharing through Registering Documents in National Document Sharing Infrastructure. |
https://ehealth.sundhed.dk/fhir/OperationDefinition--s-transform-from-PHMR.html | PHMR v1.3 XML document. | Bundle of FHIR resources. The most significant information is within an FHIR Observation. | The resulting Observation(s) is not guaranteed to be a valid FHIR Observation. |
https://ehealth.sundhed.dk/fhir/OperationDefinition--s-transform-from-QRD.html | QRD v1.3 XML document | Bundle of FHIR resources. The most significant information is within a FHIR QuestionnaireResponse. | The resulting QuestionnaireResponse is not guaranteed to be a valid FHIR QuestionnaireResponse. |
| QRD v1.3 XML document | Bundle of FHIR resources Most significant information is within an FHIR QuestionnaireResponse with a structure matching the Questionnaire given as input. The QuestionnaireResponse will have linkIDs matching the corresponding Questionnaire. | The resulting QuestionnaireResponse is not guaranteed to be a valid FHIR QuestionnaireResponse. |
https://ehealth.sundhed.dk/fhir/OperationDefinition--s-transform-from-QFDD.html | QFDD v1.2 XML document | The primary resource in the return bundle is the FHIR Questionnaire. |
|
https://ehealth.sundhed.dk/fhir/OperationDefinition--s-transform-from-APD.html | APD v2.0 XML document | Bundle of FHIR resources. The primary source of information is a FHIR Appointment. | The resulting Appointment is not guaranteed to be a valid FHIR Appointment. |
HL7 DK CDA Profile | Description | Specification |
---|---|---|
PHMR v1.3 | HL7 Implementation Guide for CDA Release 2.0, Release 1.3 31. March 2014, | http://svn.medcom.dk/svn/releases/Standarder/HL7/PHMR/Dokumentation/PHMR-DK-Profile-v1.3.pdf (Note: The available v1.3 is now updated as of March 2, 2020) |
QRD v1.3 | HL7 Implementation Guide for CDA Release 2.0, Release 1.3 February 11th 2022 | https://svn.medcom.dk/svn/drafts/Standarder/HL7/PRO/QRD/Dokumentation/DK-QRD-v1.3.pdf |
QFDD v.1.2 | HL7 Implementation Guide for CDA Release 2.0, Draft, | https://svn.medcom.dk/svn/drafts/Standarder/HL7/PRO/QFDD/Dokumentation/DK-QFDD-v1.2.pdf |
APD v2.0 | HL7 Implementation Guide for CDA Release 2.0, Draft for Trial Use, | http://svn.medcom.dk/svn/releases/Standarder/HL7/Appointment/Dokumentation/DK-APD-v2.0.pdf |
Preparing Transformations by Assembling Required FHIR Resources
As described above, the transformations to CDA XML documents require that the client provides all the required FHIR resources. What FHIR resources must be part of the assembled FHIR bundle depends on the transformation.
When the eHealth infrastructure assembles FHIR resources to transform and upload to XDS-based document-sharing infrastructure, the assembled resources are fetched from the various eHealth services. Whether this is the case for a client’s possible use is up to the client, that is, they could be provided as in-memory FHIR resources that are not stored in the infrastructure.
Assembling FHIR Resources for Transformation to PHMR
A FHIR Bundle in-memory is prepared with the resources described below, based on a ClinicalImpression approving document sharing of the FHIR Observation. Typically, the assembly (and subsequent transformation and upload) is triggered by the creation of the ClinicalImpression, but might otherwise be triggered by a ServiceRequest update reflecting a Practitioner’s registering of the citizen’s decision to change sharing policy.
FHIR Resource | Logical Part in Transformation | Comment |
---|---|---|
Observation (referenced from ClinicalImpression) | Observation Details | The Observation is the primary driver of the information contained in the generated PHMR document, including observation code, measured value, reference ranges and so on. |
DocumentationOf (CDA Header) | ||
Device (referenced from | Medical Equipment Section | Possible details about device(s) used. |
Patient (referenced from | Patient Identification | Patient identifier (CPR number), name (given & family), gender, birth date, telecom |
EpisodeOfCare (referenced from | See Author Organization below | |
Organization (referenced from | Custodian Organization | SOR ID, name, telecom, address |
Practitioner (possibly referenced from | Author, Author Individual |
|
Organization (referenced from | Author, Author Organization |
|
Composition (created as part of the assembly) | Document header (CDA Header) | The FHIR Composition resource represents the document and has fixed values as follows:
|
Organization possibly referenced from |
| |
Practitioner/Patient/RelatedPerson/Organization referenced from | Author of observation note | When the |
Practitioner/Patient possibly referenced from | Observation performer | If the observation performer is of type Practitioner it must be included in the bundle. |
Notes on assembling Author Individual and Author Organization in the Infrastructure:
The ClinicalImpression.author
and ClinicalImpression.authorOrganization
are set depending on the ServiceRequest.sharingApprovalPolicy
as follows:
For
ServiceRequest.sharingApprovalPolicy
set tomanual
:ClinicalImpression.author
is set to the Practitioner approving sharingClinicalImpression.authorOrganization
is set to the Organization referenced in the user's (the Practitioner's) security context
For
ServiceRequest.sharingApprovalPolicy
set toautomatic
:ClinicalImpression.author
is not setClinicalImpression.authorOrganization
is set to the Organization possibly referenced inCarePlan.author
(the CarePlan is resolved from the ServiceRequest resolved from the Observation). In caseCarePlan.author
is not present or does not reference an Organization, theEpisodeOfCare.caremanagerOrganization
is used.
Assembling FHIR Resources for Transformation to QRD
A FHIR Bundle in-memory is prepared with the resources described below, based on a ClinicalImpression approving document sharing of the FHIR QuestionnaireResponse. Typically, the assembly (and subsequent transformation and upload) is triggered by the creation of the ClinicalImpression, but might otherwise be triggered by a ServiceRequest update reflecting a Practitioner’s registering of the citizen’s decision to change the sharing policy.
FHIR Resource | Logical Part in Transformation | Comment |
---|---|---|
QuestionnaireResponse (referenced from ClinicalImpression) | Question/answer details | The QuestionnaireResponse is the primary driver of the information contained in QRD. |
DocumentationOf (CDA Header) | effectiveTime = | |
Patient (referenced from | Patient identification | identifier (CPR number), name (given & family), gender, birth date, telecom |
EpisodeOfCare (referenced from | See Author Organization below | |
Organization (referenced from | Custodian Organization | SOR ID, name, telecom, address |
Practitioner (referenced from | Author Individual | A consequence is that the Practitioner will appear as working in the context of the Author Organization (which is not necessarily the case). |
Organization (referenced from | Author organization | The origin of this Organization is dependent on sharingApprovalPolicy in the
If the FHIR Organization has no SOR type identifier, it is checked if it contains a SOR-relation in |
Composition (created as part of the assembly) | Document header (CDA Header) | FHIR Resource to represent document fixed values
|
Questionnaire (referenced from | Used in Document header (CDA Header) above |
Note on prerequisites for document registering:
|
DocumentReference (soft reference from | QFDD |
|
Details on Transformations to CDA Documents
Transformation to the CDA Header Details
The following table describes how logical parts in the transformation map to the header part of the CDA document. The CDA header part is common across all Danish profiles with a few variations. Certain elements of the mapping are specific to the document type (marked as <specific to document type>). The details for these elements are provided in the sections on the transformation of specific document types below.
Source (typically FHIR Resource) | Logical Part in Transformation | CDA Document | Details |
---|---|---|---|
Random UUID and details from the Infrastructure’s NamingSystem https://ehealth.sundhed.dk/fhir/NamingSystem-ehealth-identifier.html | Document id | /ClinicalDocument/id
|
|
<specific to document type> | Document title | /ClinicalDocument/title |
|
System time at the time of transformation | Time of document creation | /ClinicalDocument/effectiveTime |
|
<specific to document type> | DocumentationOf (CDA Header) | /ClinicalDocument/documentationOf[0, 1, …] | Code(s) and DateTime |
| Patient identification | /ClinicalDocument/recordTarget/patientRole | CPR-number (identification), name (given & family), gender, birth date, telecom |
<specific to document type> | Author, Author Individual | /ClinicalDocument/author/assignedAuthor/assignedPerson | Name (given & family), prefix |
| Author, Author Organization | /ClinicalDocument/author/assignedAuthor/id /ClinicalDocument/author/assignedAuthor/addr /ClinicalDocument/author/assignedAuthor/telecom /ClinicalDocument/author/assignedAuthor/representedOrganization/name | If If |
| Custodian Organization | /ClinicalDocument/custodian/assignedCustodian/representedCustodianOrganization |
|
<specific to document type> | Legal Authenticator | /ClinicalDocument/legalAuthenticator | (Not generally used but depends on the document type) |
n/a | Information Recipient | /ClinicalDocument/informationRecipientOptional | Not used |
n/a | Authenticator | /ClinicalDocument/authenticator | Not used |
n/a | Optional Participant | /ClinicalDocument/participantOptional | Not used |
n/a | Optional In Fulfillment Of | /ClinicalDocument/inFulfillmentOfOptional | Not used |
specific to QRD transformation
| Data Enterer | /ClinicalDocument/dataEnterer | If If |
Transformation to PHMR Details
The PHMR transformation entails the transformation of the CDA Header (see above) as well as the PHMR-specific parts described below.
Source (typically FHIR Resource) | Logical Part in Transformation | CDA Document | Details |
---|---|---|---|
| Document title | /ClinicalDocument/title | “Hjemmemonitorering for “ concatenated with Danish CPR, that is, |
| DocumentationOf (CDA Header) | /ClinicalDocument/documentationOf[0, 1, …] | One DocumentationOf entry for time: effectiveTime = ( |
| One DocumentationOf for each Observation.code | ||
| One DocumentationOf for each Observation.component.code | ||
| Author, Author Individual | /ClinicalDocument/author/assignedAuthor/assignedPerson | Name (given & family), prefix |
| Legal Authenticator | /ClinicalDocument/legalAuthenticator |
|
The following table details how logical parts in the transformation map to specific areas of the body part of a PHMR document.
Source (typically FHIR Resource) | Logical Part in Transformation | CDA Document | Details |
---|---|---|---|
n/a | Observation(s) Section - Results | /ClinicalDocument/component/structuredBody/component[2]/section (title=Results) | Grouping of zero, one or more Observations/Observation components |
Observation | Per Observation (or Observation and Observation.component) | /ClinicalDocument/component/structuredBody/component[2]/section/entry/organizer/component/observation/ |
|
(if an |
| /ClinicalDocument/component/structuredBody/component[2]/section/entry/organizer/component/ovservation/id | id@extension is set to id@root is set to OID value resolved from Resolving as OID type system is either (in order):
|
A random UUID ( | id@extension is set to random UUID id@root is set to | ||
|
| /ClinicalDocument/component/structuredBody/component[2]/section/entry/organizer/effectiveTime | Start date of observation. If |
|
| /ClinicalDocument/component/structuredBody/component[2]/section/entry/organizer/component/observation/code | SNOMED CT system with value set to nullFlavor. |
/ClinicalDocument/component/structuredBody/component[2]/section/entry/organizer/component/observation/code/translation |
| ||
|
| /ClinicalDocument/component/structuredBody/component[2]/section/entry/organizer/component/observation/value | Value and unit in percent are converted to unitless decimals (fraction). |
|
| /ClinicalDocument/component/structuredBody/component[2]/section/entry/organizer/component/observation/methodCode | The details for deciding the two method codes can be found in the table below. |
| |||
|
| /ClinicalDocument/component/structuredBody/component[2]/section/entry/organizer/component/observation/referenceRange | As mentioned above, the PHMR reference ranges are inverted ranges compared to the fhir format, so we need to invert the ranges when transforming to fhir. If a yellow range is present we check if there is also a red range, if so we map the yellow range to an interval between the start of the yellow range and the start of the red range. Otherwise, the ranges are open-ended. |
| Comment on observation | /ClinicalDocument/component/structuredBody/component/section/entry/organizer/component/observation/entryRelationship/act | An |
n/a | Observation(s) Section - Vital Signs | /ClinicalDocument/component/structuredBody/component[x]/section (title=Vital Signs) | Grouping of zero, one or more Observations/Observation components. Not used. Empty section created as specified in PHMR profile. |
n/a | Medical Equipment Section | /ClinicalDocument/component/structuredBody/component[3]/section (title=Medical Equipment) | Grouping of one or more Device details |
Device | Per Device in use | /ClinicalDocument/component/structuredBody/component[3]/section/entry/organizer |
|
|
| /ClinicalDocument/component/structuredBody/component[3]/section/entry/organizer/participant/participantRole/id | If a serial number or lot number is present on the Device, the id is set to the number with assigningAuthority being the number type and the root: “1.2.208.184“
|
the determined device type code (see below | When no | ||
|
| /ClinicalDocument/component/structuredBody/component[3]/section/entry/organizer/participant/participantRole/playingDevice/code/translation | If a MedCom Instrument Code matches: can be found, it is used. Otherwise set to the nullflavor NI |
|
| /ClinicalDocument/component/structuredBody/component[3]/section/entry/organizer/participant/participantRole/playingDevice/manufacturerModelName | Encoded string comprised of:
|
|
| /ClinicalDocument/component/structuredBody/component[3]/section/entry/organizer/participant/participantRole/playingDevice/softwareName | Encoded string, comprised of |
n/a | External References |
| Not used |
Determining MethodCodes
FHIR Observation.performer | FHIR Observation.quality | MethodCode 1 PerformerType | MethodCode 2 ProvisionMethod |
---|---|---|---|
|
| POT (performed by citizen) | AUT (electronically) |
| PNT (performed by a healthcare professional) | AUT (electronically) | |
| PCG (performed by caregiver) | AUT (electronically) | |
|
| POT (performed by citizen) | TPD (typed in by citizen) |
| PNT (performed by a healthcare professional) | TPH (typed in by a healthcare professional) | |
| PCG (performed by caregiver) | TPC (typed in by caregiver) |
Transforming Reference Ranges
Reference ranges (aka measurement ranges) are supported as regular, sensible ranges in the eHealth Infrastructure. In the PHMR, they are expressed as alarm thresholds. Oddly, the PHMR uses a range construct to carry the lower and higher threshold values, respectively, in effect describing an inverted range where the alarm is not in effect. Furthermore, the PHMR can contain zero, one or two alarm thresholds per observation. As shown in the figure below, the measurement range(s) in an FHIR Observation are transformed to such alarm thresholds for the PHMR document.
There need not be both yellow and red type measurement ranges and they need not be symmetrical as in the figure above. There are, however, certain constraints on which measurement ranges are supported due to the representation as alarm thresholds:
at most two yellow and two red measurement ranges are supported and they cannot be interleaved (for instance red, yellow, red, yellow)
the outermost measurement range cannot have both high and low values (because the alarm threshold is open-ended)
the outermost measurement range cannot be yellow if it is preceded by a red measurement range
In the example above, measurement ranges are overlapping (for instance yellow high value is equal to the red low value) which the Clinical Administration Application prevents by requiring non-overlapping intervals. In reality, the measurement ranges will be non-overlapping by use of exclusiveness. This is accounted for in the transformation to alarm threshold through the use of the PHMR inclusive=false | true construct.
Error situations
The transformation terminates in the error situations given below.
Situation | Error message |
---|---|
| Method codes for performerType and provisionMethod for observation with id {observationId} could not be established |
| Method codes for performerType and provisionMethod for observation with id {observationId} could not be established |
| Invalid Observation.effective, expecting DateTime, Period or Instant |
| The Value should be Quantity type and not null |
| Observation ranges should not have both High and Low set when transforming to PHRM, but High is: {high}, and Low is: {low} |
| The Value should have no more than 7 decimals but is: {value} |
| CPR is mandatory for patients but not present in the fhir bundle |
| Unknown author type: {authorType} |
| Composition.author should either be a Patient or a Practitioner |
| Composition.authorOrganization must contain SOR identifier |
| Composition.attester.party must contain SOR identifier |
| Custodian organization must contain SOR identifier |
| Composition.authorOrganization is mandatory for transformation |
| Custodian is mandatory for transformation |
| Identifier on composition is mandatory |
| Composition.confidentiality is mandatory |
| Composition.subject should be a Patient
|
A Narrative in the Results section and/or Medical Equipment section cannot be generated due to unexpected issues. | Can't generate a narrative for: medical equipment OR Can't generate a narrative for: results |
Transformation to QRD Details
The QRD transformation entails the transformation of the CDA Header (see above) as well as the QRD-specific parts described below.
QRD-specific transformation to CDA Header
Source (typically FHIR Resource) | Logical Part in Transformation | QRD Document | Details |
---|---|---|---|
|
| /ClinicalDocument/documentationOf/serviceEvent/effectiveTime/low | The transformation fails if no |
|
| /ClinicalDocument/documentationOf/serviceEvent/effectiveTime/high | If The transformation fails if |
| Author | /ClinicalDocument/author |
|
| Data Enterer | /ClinicalDocument/dataEnterer/assignedEntity (telecom, address and assignedPerson) | Transformed only when |
Details on Transformations from CDA Documents
Transformation from the CDA Document Header Details
It is described in the following table how logical parts in the transformation map the CDA header to FHIR resources. The CDA header part is common for all the Danish profiles with a few variations. Certain elements of the mapping are specific to the document type (marked as <specific to document type>). The details for these elements are specified in the sections on the transformation of specific document types below.
CDA Document | Logical Part in Transformation | FHIR Resource | Details |
---|---|---|---|
/ClinicalDocument/id | Document id | Composition.identifier | Composition.identifier is set to a new identifier with |
/ClinicalDocument/title | Document title | Composition.title |
|
/ClinicalDocument/effectiveTime | Time of document creation | Composition.date |
|
/ClinicalDocument/documentationOf[0, 1, …] | DocumentationOf (CDA Header) | <specific to document type> | Code(s) and datetime |
/ClinicalDocument/recordTarget/patientRole | Patient identification |
| A new transient Patient resource is created with address, gender, name, birth date, telecom and identifier data mapped from this element and sub-elements. Composition.subject is set to a reference to this Patient resource. |
/ClinicalDocument/author/assignedAuthor/assignedPerson | Author, Author Individual | <specific to document type> | Name (given & family), prefix |
/ClinicalDocument/author/assignedAuthor/id /ClinicalDocument/author/assignedAuthor/addr /ClinicalDocument/author/assignedAuthor/telecom /ClinicalDocument/author/assignedAuthor/representedOrganization/name | Author, Author Organization |
| If present the organizationName is taken from assignedAuthor/representedOrganization The organization source is set to manual and the synchronizationStatus is set to NotSynchronized |
/ClinicalDocument/custodian/assignedCustodian/representedCustodianOrganization | Custodian Organization |
| A new transient Organization resource is created with name, identifier and address data set from elements and sub-elements. The organization source is set to manual and the synchronizationStatus is set to “NotSynchronized” |
/ClinicalDocument/legalAuthenticator | Legal Authenticator | <specific to document type> | (Not generally used but depends on the document type) |
/ClinicalDocument/informationRecipientOptional | Information Recipient | n/a | Not used |
/ClinicalDocument/authenticator | Authenticator | n/a | Not used |
/ClinicalDocument/participantOptional | Optional Participant | n/a | Not used |
/ClinicalDocument/inFulfillmentOfOptional | Optional In Fulfillment Of | n/a | Not used |
/ClinicalDocument/ |
|
|
|
Transformation from PHMR Document Details
The PHMR format and the FHIR model of the eHealth Infrastructure vary in what information is represented. The transformations to PHMR and from PHMR document are not symmetric.
When transforming from FHIR resources, an FHIR Observation with components is mapped to consecutive observations in the PHMR document. When transforming from a PHMR document, there is no way of knowing which observations where originally components and consequently, each observation is transformed into an individual FHIR Observation.
General principles of the transformation:
Principle | Description |
---|---|
No assumptions on pedigree | The input PHMR document could be from any source. It is most likely, however, that it was retrieved from the national document-sharing infrastructure. |
Assume the PHMR document adheres to the profile |
|
Preserve as much information as possible | The resulting FHIR resources are not guaranteed to be persistable in the eHealth Infrastructure, cf. the note on varying information represented (see above). The transformation can result in one or more FHIR resources without element values in cases where the presence of the FHIR resource alone represents the information in the PHMR document. A FHIR MethodOutcome can be part of the FHIR Bundle returned by the transformation operation. The MethodOutcome will reflect possible data loss. |
CDA Document | Logical Part in Transformation | FHIR Resource | Details |
---|---|---|---|
/ClinicalDocument/component/structuredBody/component[2]/section (title=Results) | Observation(s) Section - Results | n/a | Grouping of zero or more measurements each transformed to an observation as described below |
/ClinicalDocument/component/structuredBody/component[2]/section/entry/organizer/component/observation/ | Per Observation (or Observation and Observation.component) | Observation |
|
/ClinicalDocument/component/structuredBody/component[2]/section/entry/organizer/component/ovservation/id |
|
|
Observation.identifier.system is set to “urn:oid:”+id@root |
/ClinicalDocument/component/structuredBody/component[2]/section/entry/organizer/effectiveTime |
|
| Observation.effective |
/ClinicalDocument/component/structuredBody/component[2]/section/entry/organizer/component/observation/code |
|
| if code is present and not “NI” a code is added to Observation.code with code = @code and display = @displayName If it is possible to match the value of @codeSystem with the oid of the known code system, system is set to the URL of the known codeSystem. If now the value of codeSystem is set to “urn:oid:” + |
/ClinicalDocument/component/structuredBody/component[2]/section/entry/organizer/component/observation/code/translation | if code is present and not “NI” a code is added to Observation.code with code = @code and display = @displayName If it is possible to match the value of @codeSystem with the oid of the known code system, system is set to the URL of the known codeSystem. If now the value of codeSystem is set to “urn:oid:” + | ||
/ClinicalDocument/component/structuredBody/component[2]/section/entry/organizer/component/observation/value |
|
| If the value of @unit is “NA” and the value of @value is a 2 decimal value, the |
/ClinicalDocument/component/structuredBody/component[2]/section/entry/organizer/component/observation/methodCode |
|
| If the performer is specified as a citizen the If not, it is not possible discern between health-care professionals as performers and care giver as performer in the FHIR model. So If a provision method specifies that the observation was entered by a different actor than the performer, there is no way of representing this and an issue is raised. |
| If the provision method is listed as automatic, a coding is added to the observation quality specifying this, if not the coding specifies that it is entered manually. | ||
/ClinicalDocument/component/structuredBody/component[2]/section/entry/organizer/component/observation/referenceRange |
|
| FHIR ranges are inverted to PHMR representation. Only Other |
/ClinicalDocument/component/structuredBody/component/section/entry/organizer/component/observation/entryRelationship/act | Comment on observation | None | This information is currently ignored. |
/ClinicalDocument/component/structuredBody/component[x]/section (title=Vital Signs) | Observation(s) Section - Vital Signs |
| Grouping of zero or more measurements, handled like the result section as described above |
/ClinicalDocument/component/structuredBody/component[3]/section (title=Medical Equipment) | Medical Equipment Section | n/a | Grouping of one or more Device details |
/ClinicalDocument/component/structuredBody/component[3]/section/entry/organizer | Per Device in use | Device |
|
/ClinicalDocument/component/structuredBody/component[3]/section/entry/organizer/participant/participantRole/id |
|
| set to @extension
|
/ClinicalDocument/component/structuredBody/component[3]/section/entry/organizer/participant/participantRole/playingDevice/code/translation |
|
| A Coding is added to Device.type with system = code = @code display = @displayName |
/ClinicalDocument/component/structuredBody/component[3]/section/entry/organizer/participant/participantRole/playingDevice/manufacturerModelName |
|
| If the element value matches the regular expression the string is split in 3 and set to Otherwise |
/ClinicalDocument/component/structuredBody/component[3]/section/entry/organizer/participant/participantRole/playingDevice/softwareName |
|
|
|
| External References | n/a | Not used |
Errors and issues
When transforming from a PHMR document to a FHIR representation, the goal is to preserve as much information as possible and there are no hard requirements for validity of the produced FHIR resources. When it is not possible to translate specific data in the PHMR document to FHIR, an issue describing the situation or missing information is added to a FHIR OperationOutcome resource included in the return Bundle. Except for cases where it is not possible to translate the measurement values. In these cases the system throws an error and aborts the transformation.
The situations where an error is thrown and the transformation is aborted:
Situation | Error message |
---|---|
A measurement with type Observation Media is present | Measurement was of media type. This was not translated to an observation since it is not supported in FHIR |
A measurement range with more than 7 decimals is present | Could not transform measurement with reference range Low: %s and High: %s since we cannot correctly translate more than 7 decimals. |
The situations where an issue is raised as a warning in the OperationOutcome:
Situation | Issue message |
---|---|
A method code denoting the provision method is missing | Measurement provision method code is missing |
A method code denoting that the provision method was “typed in by relative” | Provision method of measurement was marked as typed by relative, it is not possible to reflect this in the FHIR model. The usage quality is marked as manually entered. |
A method code denoting that the provision method was “typed in by health care professional” and method code denoting that performer was not “health care professional” | Provision method of measurement was marked as typed by healthcare professional, it is not possible to reflect this in the FHIR model. The usage quality is marked as manually entered. |
A method code denoting that the provision method was “typed in by care giver” and method code denoting that performer was not “care giver” | Provision method of measurement was marked as typed by caregiver, it is not possible to reflect this in the FHIR model. The usage quality is marked as manually entered. |
A method code denoting that the provision method was “typed in by citizen” and method code denoting that performer was not “citizen” | Provision method of measurement was marked as typed by citizen, it is not possible to reflect this in the FHIR model. The usage quality is marked as manually entered. |
A method code denoting that the performer is care giver | It is not possible to discern between care giver and health care professional in the FHIR model. The method code indicated the performer was a care giver. |
A method code denoting that the performer is health care professional | It is not possible to discern between care giver and health care professional in the FHIR model. The method code indicated the performer was a health care professional. |
A method code denoting the performer is missing | Measurement performer code is missing |
The confidentiality code is missing | Confidentiality code is missing |
The confidentiality code is not “N” | Confidentiality code is not supported |
A measurement with a value interval | Measurement contained an interval value. This was not translated to an observation since it is not supported in FHIR |
Transformation from QRD Details
The QRD transformation entails transformation of the CDA Header (see above) as well as QRD-specific parts described below.
Matching between FHIR Questionnaire, FHIR QuestionnaireResponse and QFDD
Just like the FHIR QuestionnaireResponse must be structurally consistent with the FHIR Questionnaire, the QRD must be structurally consistent with the QFDD. It follows that transformation of a FHIR QuestionnaireResponse to a QRD implies that the FHIR Questionnaire must be an approximation of the QFDD.
The following are prerequisites for a FHIR Questionnaire (shortened Questionnaire and covering both the ehealth-questionnaire and ehealth-questionnaire-advanced profiles) to be an approximation of a QFDD:
At root level of the FHIR Questionnaire, the number of question groups (
Questionnaire.item
withitem.type
set togroup
) shall match the number of QFDD sections for all but QFDD copyright section.Rationale: Copyright is placed in
Questionnaire.copyright
.
For each QFDD section except Information Only sections, the number of FHIR Questionnaire subgroups (
Questionnaire.item.item
withitem.type
set togroup
) shall match the number of QFDD organizers inside the section.The
Questionnaire.item
.item.externalIdentifier
(on a subgroup) shall match the QFDD organizer id.
For each QFDD question within an organizer there shall be a FHIR Questionnaire question item (
Questionnaire.item.item.item
)The
Questionnaire.item
.item.item.externalIdentifier
shall match the QFDD question id.A QFDD question with associated text shall have the associated text represented as a separate FHIR Questionnaire question item (
Questionnaire.item.item.item
)
Calculation type
Questionnaire.item
at any level are allowed in the FHIR Questionnaire without counterpart in the QFDDRationale: Calculations and formulas are not represented in QFDD.
Overall these prerequisites for approximation of QFDD ensures that the FHIR Questionnaire is structurally compatible with QFDD. In addition, groups, subgroups and questions must have the same ids and the same order. Also, the use of coded values for questions, answer options, and possibly subgroups must be identical.
The QFDD organizer/question id is matched to the corresponding item in a FHIR Questionnaire by item.item.item.extension.externalIdentifier
. The Questionnaire.item.linkId
is compared with QuestionnaireResponse.item.linkId
(at any level, that is also for Questionnaire.item.item and .item.item.item) to locate the same item in the QuestionnaireResponse.
Validation
As part of the transformation from FHIR QuestionnaireResponse to QRD, validation of the QFDD approximation prerequisites is performed.
QRD-specific CDA Header
Logical Part | QRD Document | Details |
---|---|---|
Documentation Time Interval | /ClinicalDocument/documentationOf/serviceEvent/effectiveTime/low |
|
/ClinicalDocument/documentationOf/serviceEvent/effectiveTime/high |
| |
Author | /ClinicalDocument/author |
The referenced resource type depends on the following:
|
Author | /ClinicalDocument/dataEnterer/assignedEntity |
The referenced resource type depends on the following:
|
Information Only Section
Logical Part | QRD Document | Details |
---|---|---|
Information Only Section | /ClinicalDocument/component/structuredBody/component/section |
|
Title | …/component/section/title | From root item |
Narrative | …/component/section/text | QFDD text (…/component/section/text) |
Language | languageCode |
|
Questionnaire Response Section
Logical Part | QRD Document | Details |
---|---|---|
Questionnaire Response Section | /ClinicalDocument/component/structuredBody/component/section | A root item on |
Title | …/component/section/title | From root item |
Narrative | …/component/section/text | QFDD text (…/component/section/text) The narrative (QFDD text) from the QFDD section is updated with answers before being assigned to the QRD section text. |
Language | languageCode |
|
Response Organizer
Logical Part | QRD Document | Details |
---|---|---|
Response Organizer | /ClinicalDocument/component/structuredBody/component/section/entry/organizer | An item of type Only items of type OBS: Items with calculated expression are allowed but is ignored during transformation. |
Id | …/section/entry/organizer/id | QFDD id (…/section/entry/organizer/id). Validating if item( |
Code | …/section/entry/organizer/code | Uses code from Questionnaire item Code: CodeSystem: if CodeSystemName: is fetched from CodeSystem in Questionnaire Terminology. Value is taken in the following order: codeSystem.title, codeSystem.name, codeSystem.url or “Unknown“. Display: OriginalText: Question text ( |
Numeric Response Pattern Observation
Logical Part | QRD Document | Details |
---|---|---|
Numeric Response Pattern Observation | /ClinicalDocument/component/structuredBody/component/section/entry/organizer/component/observation | An item inside a subgroup
Numeric Response if
|
Id | …/observation/id | Uses Id from QFFD question Validating if Questionnaire item( |
Code | …/observation/code | Uses code from Questionnaire item Code: CodeSystem: if CodeSystemName: is fetched from CodeSystem in Questionnaire Terminology. Value is taken in the following order: codeSystem.title, codeSystem.name, codeSystem.url or “Unknown“. Display: OriginalText: Question text ( |
Answer | …/observation/value | Value: For For For QRD Type:
|
Help text Image | …/observation/entryRelationship | Is added if Questionnaire item has one or more extensions: |
External reference | …/observation/reference | The QFDD unique id. From id element and the property 'extension' |
Range | …/observation/referenceRange | If |
Analog Slider Response Pattern Observation
Logical Part | QRD Document | Details |
---|---|---|
Analog Slider Response Pattern Observation | /ClinicalDocument/component/structuredBody/component/section/entry/organizer/component/observation | An item inside a subgroup
Analog Slider Response if
Properties: id, code, value, entryRelationship and reference is the same configuration as for numeric Response |
Id | …/observation/id | Uses Id from QFFD question Validating if Questionnaire item( |
Code | …/observation/code | Uses code from Questionnaire item Code: CodeSystem: if CodeSystemName: is fetched from CodeSystem in Questionnaire Terminology. Value is taken in the following order: codeSystem.title, codeSystem.name, codeSystem.url or “Unknown“. Display: OriginalText: Question text ( |
Answer | …/observation/value | Value: For For Type:
|
Help text Image | …/observation/entryRelationship | Is added if Questionnaire item has one or more extensions: |
External reference | …/observation/reference | The QFDD unique id. From id element and the property 'extension' |
Range | …/referenceRange/observationRange/ | Denominator: Head: Increment: |
Text Response Pattern Observation
Logical Part | QRD Document | Details |
---|---|---|
Text Response Pattern Observation | /ClinicalDocument/component/structuredBody/component/section/entry/organizer/component/observation | An item inside a subgroup
Test Response if
|
Id | …/observation/id | Uses Id from QFFD question Validating if Questionnaire item( |
Code | …/observation/code | Uses code from Questionnaire item Code: CodeSystem: if CodeSystemName: is fetched from CodeSystem in Questionnaire Terminology. Value is taken in the following order: codeSystem.title, codeSystem.name, codeSystem.url or “Unknown“. Display: OriginalText: Question text ( |
Answer | …/observation/value | Value: For Type: ST |
Help text Image | …/observation/entryRelationship | Is added if Questionnaire item has one or more extensions: |
External reference | …/observation/reference | Value from QFDD. From id element and the property 'extension' |
Multiple Choice Response Pattern Observation
Logical Part | QRD Document | Details |
---|---|---|
Multiple Choice Response Pattern Observation | /ClinicalDocument/component/structuredBody/component/section/entry/organizer/component/observation | An item inside a subgroup
Multiple Choice Response if
|
Id | …/observation/id | Uses Id from QFFD question Validating if Questionnaire item( |
Code | …/observation/code | Uses code from Questionnaire item Code: CodeSystem: if CodeSystemName: is fetched from CodeSystem in Questionnaire Terminology. Value is taken in the following order: codeSystem.title, codeSystem.name, codeSystem.url or “Unknown“. Display: OriginalText: Question text ( |
Answer | …/observation/value | Value: from For Code: CodeSystem: if CodeSystemName: is fetched from CodeSystem in Questionnaire Terminology. Value is taken in the following order: codeSystem.title, codeSystem.name, codeSystem.url or “Unknown“. Display: |
Help text Image Associated text question | …/observation/entryRelationship | Is added if Questionnaire item has one or more extensions:
And if QFDD has associated text question and preconditions are fulfilled. Structure for associated text question in FHIR Questionnaire:
OBS: Supported precondition for Associated text question:
|
External reference | …/observation/reference | The QFDD unique id. From id element and the property 'extension' |
Range | …/observation/referenceRange | If |
Discrete Slider Response Pattern Observation
Logical Part | QRD Document | Details |
---|---|---|
Discrete Slider Response Pattern Observation | /ClinicalDocument/component/structuredBody/component/section/entry/organizer/component/observation | An item inside a subgroup
Multiple Choice Response if
|
Id | …/observation/id | Uses Id from QFFD question Validating if Questionnaire item( |
Code | …/observation/code | Uses code from Questionnaire item Code: CodeSystem: if CodeSystemName: is fetched from CodeSystem in Questionnaire Terminology. Value is taken in the following order: codeSystem.title, codeSystem.name, codeSystem.url or “Unknown“. Display: OriginalText: Question text ( |
Value | …/observation/value | Value: from For Code: CodeSystem: if CodeSystemName: is fetched from CodeSystem in Questionnaire Terminology. Value is taken in the following order: codeSystem.title, codeSystem.name, codeSystem.url or “Unknown“. Display: |
Max occurrence Min occurrence Help text Image | …/observation/entryRelationship | Low: http://hl7.org/fhir/StructureDefinition/questionnaire-minOccurs High: http://hl7.org/fhir/StructureDefinition/questionnaire-maxOccurs always 1 (1 only allowed value for Discrete Slider type) Is added if Questionnaire item has one or more extensions: |
QFDD reference | …/observation/reference | The QFDD unique id. From id element and the property 'extension' |
Copyright Section
Logical Part | QRD Document | Details |
---|---|---|
Copyright Section | /ClinicalDocument/component/structuredBody/component/section | Copyright section is copied directly from the QFDD |
Supported types
FHIR Questionnaire.item.type | QRD Response Pattern Observation |
---|---|
text, string | Text Response Pattern Observation |
choice | Multiple Choice Response Pattern Observation Discrete Slider Response Pattern Observation (when |
decimal, integer | Numeric Response Pattern Observation Analog Slider Response Pattern Observation (when |
datetime | Numeric Response Pattern Observation |
Transformation from QFDD Details
The QFDD transformation entails transformation of the CDA Header (see above) as well as QFDD-specific parts described below.
Overall and except for certain details described below, the structure of the Questionnaire must match the structure of the QFDD.
This means that the structure rules below must be adhere to and that information sections/groups and questions must be in the same order.
QFDD Element | FHIR Questionnaire | Comment |
---|---|---|
Information Only Section | A A single child item |
|
Question Section (with one or more Question Organizer) | A For each QFDD Question Organizer: A single child item For each question in the group/QFDD Question Organizer: A single child item |
|
Not transformed as algorithms and expressions are not supported in QFDD. | A | A Calculated expression within the questionnaire, see https://ehealth-dk.atlassian.net/wiki/spaces/EDTW/pages/1716060177/Managing+Questionnaires#Defining-a-Calculation-Expression |
To QFDD Transformation
The operation $transform-to-QFDD
transforms a FHIR Questionnaire resource to a DK-HL7 Questionnaire Form Definition Document (QFDD). The section below describes the transformation in more details.
Structure
As a QFDD is structured by sections, organizers and questions, the FHIR Questionnaire must be structured in a specified way to match the QFDD definition. The table below gives a quick overview of the structure.
QFDD Element | FHIR Questionnaire | Comment |
---|---|---|
Information Only Section | A A single child item |
|
Question Section (with one or more Question Organizer) | A | Root-level group |
For each QFDD Question Organizer: A single child item | Subgroup of root-level group | |
For each question in the group/QFDD Question Organizer: A single child item | Question type item in subgroup of root-level group. For subtypes of | |
Copyright Section | A
One or more child items
|
|
Not transformed as algorithms and expressions are not supported in QFDD. | A | A Calculated expression within the FHIR Questionnaire, see https://ehealth-dk.atlassian.net/wiki/spaces/EDTW/pages/1716060177/Managing+Questionnaires#Defining-a-Calculation-Expression |
The sub sections below describe the structure and information needed in more details.
Information Only Section
Logical Part | QFDD Document | Details |
---|---|---|
Information Only Section | /ClinicalDocument/component/structuredBody/component/section (with (./templateId | A root-level item with:
|
| …/component/section/title |
|
| …/component/section/text | A child item in the group with:
|
| /ClinicalDocument/languageCode |
|
Narrative guidelines and limitations
FHIR Questionnaire.item.text.xhtml
has type XHTML and QFDD narrative has type XML Markup. Therefore the transformation must convert XHTML to XML Markup which is performed with limitations as described below.
Limitations on conversion of formatted text from FHIR XHTML to XML Markup
The converter supports:
Paragraphs
Headings - converts to paragraphs
Bold, italics, underline
Ordered and unordered list
Line break
Table (might not support all functionality)
Anchor tag ( from a -> linkHTML)
Span (converted to content)
Subscript and superscript
Be aware:
Stylings like color are not supported.
A single root div shall be present
Sanitizer
Questionnaire Form Definition Section
Logical Part | QFDD Document | Details |
---|---|---|
Questionnaire Response Section | /ClinicalDocument/component/structuredBody/component/section | A root item on |
Title | …/component/section/title | From root item |
Narrative | …/component/section/text | The narrative text for the section is created automatically by the transformation . The narrative contains all the questions inside the section. Additional narrative content:
|
Language | languageCode |
|
Questions Organizer
Logical Part | QFDD Document | Details |
---|---|---|
Response Organizer | /ClinicalDocument/component/structuredBody/component/section/entry/organizer | An item of type Only items of type OBS: Items with calculated expression are allowed but is ignored during transformation. |
Id | …/section/entry/organizer/id |
|
Code | …/section/entry/organizer/code | Uses code from Questionnaire item Code: CodeSystem: if CodeSystemName: is fetched from CodeSystem in Questionnaire Terminology. Value is taken in the following order: codeSystem.title, codeSystem.name, codeSystem.url or “Unknown“. Display: OriginalText: Question text ( |
Precondition | …/section/entry/organizer/precondition | See Preconditions |
Numeric Question Pattern Observation
Logical Part | QFDD Document | Details |
---|---|---|
Numeric Response Pattern Observation | /ClinicalDocument/component/structuredBody/component/section/entry/organizer/component/observation | An item inside a subgroup (see Questions Organizer )
Numeric Response if
|
Id | …/observation/id |
|
Code | …/observation/code | Uses code from Questionnaire item Code: CodeSystem: if CodeSystemName: is fetched from CodeSystem in Questionnaire Terminology. Value is taken in the following order: codeSystem.title, codeSystem.name, codeSystem.url or “Unknown“. Display: OriginalText: Question text ( |
Help text Image | …/observation/entryRelationship | Is added if Questionnaire item has one or more extensions: |
Feedback | …/observation/entryRelationship | Not supported |
Range | …/observation/referenceRange | If |
Precondition |
| See Preconditions |
Analog Slider Question Pattern Observation
Logical Part | QFDD Document | Details |
---|---|---|
Analog Slider Question Pattern Observation | /ClinicalDocument/component/structuredBody/component/section/entry/organizer/component/observation | An item inside a subgroup
Analog Slider if
Properties: id, code, help text, image and precondition is the same configuration as for Numeric Question |
Feedback | …/observation/entryRelationship | Not supported |
Range | …/referenceRange/observationRange/ | Denominator: Head: Increment:
|
Text Question Pattern Observation
Logical Part | QFDD Document | Details |
---|---|---|
Text Question Pattern Observation | /ClinicalDocument/component/structuredBody/component/section/entry/organizer/component/observation | An item inside a subgroup
Test Response if
|
Id | …/observation/id |
|
Code | …/observation/code | Uses code from Questionnaire item Code: CodeSystem: if CodeSystemName: is fetched from CodeSystem in Questionnaire Terminology. Value is taken in the following order: codeSystem.title, codeSystem.name, codeSystem.url or “Unknown“. Display: OriginalText: Question text ( |
Help text Image | …/observation/entryRelationship | Is added if Questionnaire item has one or more extensions: |
Precondition |
| See Preconditions |
Multiple Choice Question Pattern Observation
Logical Part | QFDD Document | Details |
---|---|---|
Multiple Choice Question Pattern Observation | /ClinicalDocument/component/structuredBody/component/section/entry/organizer/component/observation | An item inside a subgroup
Multiple Choice if
|
Id | …/observation/id |
|
Code | …/observation/code | Uses code from Questionnaire item Code: CodeSystem: if CodeSystemName: is fetched from CodeSystem in Questionnaire Terminology. Value is taken in the following order: codeSystem.title, codeSystem.name, codeSystem.url or “Unknown“. Display: OriginalText: Question text ( |
Options |
|
|
Help text Image | …/observation/entryRelationship | Is added if Questionnaire item has one or more extensions: |
Associated text question |
| Not supported |
Feedback |
| Not supported |
Range | …/observation/referenceRange | Range is based on
See more regarding min and max: https://docs.ehealth.sundhed.dk/latest-released/ig/StructureDefinition-ehealth-questionnaire.html#setting-minimal-and-maximal-number-of-permitted-choices |
Precondition |
| See Preconditions |
Discrete Slider Question Pattern Observation
Logical Part | QFDD Document | Details |
---|---|---|
Discrete Slider Question Pattern Observation | /ClinicalDocument/component/structuredBody/component/section/entry/organizer/component/observation | An item inside a subgroup
Multiple Choice if
Properties: id, code, help text, image and precondition is the same configuration as for Multiple Choice |
Id | …/observation/id | Uses Id from QFFD question Validating if Questionnaire item( |
Code | …/observation/code | Uses code from Questionnaire item Code: CodeSystem: if CodeSystemName: is fetched from CodeSystem in Questionnaire Terminology. Value is taken in the following order: codeSystem.title, codeSystem.name, codeSystem.url or “Unknown“. Display: OriginalText: Question text ( |
Range | …/observation/entryRelationship | Range is based on Low: http://hl7.org/fhir/StructureDefinition/questionnaire-minOccurs High: http://hl7.org/fhir/StructureDefinition/questionnaire-maxOccurs always 1 (1 only allowed value for Discrete Slider type) See more regarding min and max: https://docs.ehealth.sundhed.dk/latest-released/ig/StructureDefinition-ehealth-questionnaire.html#setting-minimal-and-maximal-number-of-permitted-choices |
Copyright Section
Logical Part | QFDD Document | Details |
---|---|---|
Copyright Section | /ClinicalDocument/component/structuredBody/component/section | Copyright section uses |
Logical Part | QFDD Document | Details |
---|---|---|
Copyright Section | /ClinicalDocument/component/structuredBody/component/section (with (./templateId | A root-level item with:
|
Title | …/component/section/title |
|
Narrative | …/component/section/text | The narrative is automatically generated by the transformation and contains the plain text from each copyright text(entry) separated by three <br/>. Note: When transforming from QFDD to FHIR Questionnaire the narrative is not transformed. |
Entry | ../entry/observation/value | One or more child items in the group with:
Note: When transforming from QFDD the display items will contain the plain text. |
| /ClinicalDocument/languageCode |
|
Supported types
FHIR Questionnaire.item.type | QRD Response Pattern Observation |
---|---|
text, string | Text Question Pattern Observation. |
choice | Multiple Choice Question Pattern Observation. Discrete Slider Question Pattern Observation when |
decimal, integer | Numeric Question Pattern Observation. Analog Slider Question Pattern Observation when |
datetime | Numeric Question Pattern Observation |
Validation
The returned Bundle from the operation can contain an OperationOutcome with warnings and errors. In case of validation errors no QFDD will be generated.
Errors
Errors can occur if for instance some mandatory information is missing or the FHIR questionnaire structure is not compatible with the QFDD structure.
Examples:
Invalid root item in questionnaire. Only items of type 'group' and calculated expression items are allowed. Type was: '%s'. LinkId: %s
NamingSystem publisher is missing. Oid: '%s'. Referenced by items with following LinkIds: %s
Item enableWhen refers to item with linkId: '%s' which is of type '%s' but the operator: '%s' is not supported. LinkId: %s
Warnings
Warnings can occur if some information is missing but not mandatory or maybe a fallback value is used instead.
Examples:
CodeSystem title is missing. Will use the first non-null value as CodeSystemName: 'NamingSystem.name', 'NamingSystem.url' or 'unknown'. CodeSystem url: '%s'. Used by items with the following linkIds: %s
CodeSystem title is missing for choice option. Will use the first non-null value as CodeSystemName: 'NamingSystem.name', 'NamingSystem.url' or 'unknown'. CodeSystem url: '%s'. LinkIds: %s
Preconditions
In some scenarios a questions should only be asked to the user based on answers given to other questions. The sections below describes the rules and limitations regarding preconditions.
Precondition rules
As the modeling of preconditions in FHIR questionnaire and QFDD is not 1 to 1 the table below describes which combination of preconditions that are supported.
Question refers to question of type | Condition |
|
---|---|---|
Numeric (FHIR type: integer, decimal, timestamp) | If specifying both ">=" and "<=" to the same question then |
|
| ||
If specifying only one operator either ">=" or "<=" to the same numeric question then |
| |
if specifying "=" to a numeric question then |
| |
Choice (FHIR type: choice) | When specifying "=" to a choice question then |
|
text, string |
| Precondition to text or string questions are not supported. |
Precondition is only allowed on FHIR sub groups(item.item (QFDD organizer)) and questions (item.item.item (QFDD Question)).
If enablebehavior is ‘all’(AllTrue) and no condition-id is specified then the preconditions will be created as QFDD Criterion(s). If condition-id is specified and/or the boolean expression is either ‘all’(AllTrue) or ‘any’(AtLeastOneTrue) then the preconditions will be created as QFDD Precondition Extension Pattern.
Supported operators
FHIR Questionnaire (enableWhen operators) | Comments |
---|---|
exists | Not supported |
= | Supported. If numeric:
If multiple choice
|
!= | Not supported |
> | Not supported |
< | Not supported |
>= | if numeric:
If multiple choice
|
<= | if numeric:
If multiple choice
|
From QFDD Transformation
The operation $transform-from-QFDD
transforms a DK-HL7 Questionnaire Form Definition Document (QFDD) to a FHIR Questionnaire resource. The below sections describes the transformation in more details.
Structure
The transformation generates a FHIR questionnaire which structure is describes in below table. See more details regarding the structure here https://ehealth-dk.atlassian.net/wiki/spaces/EDTW/pages/edit-v2/2242281473#Structure.
QFDD Element | FHIR Questionnaire | Comment |
---|---|---|
Information Only Section | A A single child item |
|
Question Section (with one or more Question Organizer) | A For each QFDD Question Organizer: A single child item For each question in the group/QFDD Question Organizer: A single child item |
|
Copyright Section | A
One or more child items
|
|
Not transformed as algorithms and expressions are not supported in QFDD. | A | A Calculated expression within the questionnaire, see https://ehealth-dk.atlassian.net/wiki/spaces/EDTW/pages/1716060177/Managing+Questionnaires#Defining-a-Calculation-Expression |
Details regarding converting from CDA XML Markup to XHTML - Information Only Section
All CDA XML elements are supported but with some exceptions,
CDA XML element | FHIR XHTML |
---|---|
footnote | p, with a data attribute: data-cda-tag = "footnote" |
footnoteRef | a, with a data attribute data-cda-tag="footnoteRef" |
renderMultiMedia | Limitation: The base64 image to be inside @referencedObject attribute, and not a reference to an existing image from other section from QFDD document. We don't search the image. |
Attributes:
CDA XML attributes | Comment |
---|---|
revised | Attribute on <content> in CDA XML has no corresponding match in XHTML. A custom data attribute has been added ‘data-cda-revised’. |
name | Attribute on <linkHTML> is not supported as NarrativeBlock documentation states “DO NOT USE THIS”. |
language | Always assigned lang=”da”. |
mediaType | Omitted. From NarrativeBlock documentation: mediaType is akin to mimeType. This is a fixed value in the CDA narrative block, and so can be omitted. |
Validation
The returned Bundle from the operation can contain an OperationOutcome with information, warnings and errors. In case of validation errors no FHIR questionnaire will be generated.
Errors
Errors can occur if for instance some mandatory information is missing or QFDD content is not supported in FHIR questionnaire.
Examples:
Unsupported question type: '%s'
(safeguard against future question types supported in CDA Builder. Currently(August 2024) all question types are supported)Choice option is missing either code, codeSystem. Question id: %s
Question is missing id. Organizer id: %s
Precondition group type: '%s' is not supported. Question id: %s
Precondition group type: '%s' is not supported for conditions referring to numeric questions. Only 'AllTrue' is supported. Question id: %s
Warnings
Warnings can occur if some information is missing but not mandatory or content which will not be transformed as it is not supported.
Examples:
Numeric question has no interval. Cannot determine type. Setting item.type to 'decimal'. Question id: %s
Feedback will not be transformed to FHIR questionnaire. Question id: %s
Information
Message unrelated to the transformation success.
Examples:
Question with id: '%s' has associated text question with id: '%s'. The questions will be split into two separate question items in Fhir questionnaire.
Preconditions
In some scenarios a questions should only be asked to the user based on answers given to other questions. The sections below describes the rules and limitations regarding preconditions.
Precondition rules
As the modeling of preconditions in FHIR questionnaire and QFDD is not 1 to 1 the table below describes which combination of preconditions that are supported.
Condition | Rules |
---|---|
If one or more precondition refers to numeric question then | AllTrue(all) is supported. |
If no precondition refers to a numeric question then | AllTrue(all) and AtLeastOneTrue(any) is supported. |
Not supported:
The following precondition types is not supported: AllFalse, AtLeastOneFalse, OnlyOneTrue, OnlyOneFalse.
Multiple grouper (Only one grouper is supported eg. AllTrue).
Additional information
Associated text question which can be part of Multiple Choice and Discrete Slider question will be created as two items in FHIR questionnaire. The item for the associated text question will contain the preconditions specified in the QFDD.
As QFDD Numeric Question do not have a type, reference range is used to determine if it is integer, decimal or timestamp. If no reference range is specified the question item is created with
item.type
‘decimal’.Analog Slider Question is created with
item.type
‘decimal’.Feedback is not supported