Validatie

Validatie kan op verschillende zaken betrekking hebben en op verschillende momenten plaatsvinden. we kunnen onderscheid maken tussen:

  • Deelnemer validatie - De controle van de data door de deelnemer zelf.
  • Structuur validatie - De controle van het bericht of deze kan worden verwerkt in het juiste format. (controle XML of JSON).
  • FHIR validatie - De controle van het bericht of dit kan worden verwerkt door de FHIR library.
  • NICE validatie - De inhoudelijke controle van de data op basis van de regels van NICE.

Deelnemer validatie

Uit een haalbaarheidsstudie is gebleken dat de deelnemers zelf in controle willen blijven over de data. met name om een goedkeuring uit te spreken of de data correct is. Ook werd de meerwaarde gezien van het snel kunnen versturen van data. Zeker in deze tijden met de COVID-19 registratie. Op de vraag of bijvoorbeeld de opnamegegevens achteraf nog vaak aangepast worden, werd gedacht van niet. Dit maakt dat wij (NICE / RIVM) denken dat deze informatie geschikt zou kunnen zijn voor de SARI-Surveillance. We zullen de verschillende versies van data bewaren, zodat we hier meer onderzoek naar kunnen doen.

Elke QuestionnaireResponse zal worden voorzien van een item genaamd “isgevalideerd” als boolean (true/false). Hiermee kan worden aangegeven of de data die in de betreffende questionnaireresponse is opgenomen, is gecontrolleerd door de deelnemer.

Meer over SARI-Surveillance

Structuur validatie

Dit is de controle of het aangeleverde bericht voldoet aan de standaarden XML of JSON. Wanneer er een fout in het bericht zit, waardoor het geen valide XML of JSON is dan zal de server een foutmelding geven en het bericht verder niet verwerken.

Wanneer een bericht wordt ingediend wat invalide XML of JSON bevat, wordt een error gegeven van het type processing. In dit geval is een bericht ingediend waarbij op rij 12, kolom 5 een element stond wat niet was afgesloten met een “>” (oftewel: "&gt").

<OperationOutcome xmlns="http://hl7.org/fhir">
   <issue>
      <severity value="error"></severity>
      <code value="processing"></code>
      <diagnostics value="Failed to parse request body as XML resource. Error was: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[12,5] Message: Element type &quot;entry&quot; must be followed by either attribute specifications, &quot;&gt;&quot; or &quot;/&gt;&quot;."></diagnostics>
   </issue>
</OperationOutcome>

FHIR validatie

Wanneer het bericht valide is qua structuur, dan wordt het door de server geparsed naar FHIR objecten, wanneer de library (HAPI FHIR) een fout constateert, dan zal de server een outcome response geven.

NICE validate

De FHIR validatie wordt vervolgens nog aangevuld door de NICE validatie. Hierbij worden de controles, die zijn opgesteld voor een dataset uitgevoerd op het bericht. Hierbij moet rekening worden gehouden dat de berichten op meerdere momenten moeten worden vestuurd en dus dat mogelijk niet alle data compleet is.

Indien een bericht OK wordt aangeleverd en een bestaand record is aangepast, zal de FHIR server een lege body terug geven met HTTP code 200. Indien een nieuw record is aangemaakt, wordt HTTP code 201 gegeven.

responseCode	200

OF

responseCode	201

$validate

Een van de door FHIR gedefinieerde operations is $validate. Met deze operatie kan een resource gevalideerd worden, zonder dat deze op de server wordt opgeslagen. De response is een Outcome, waarin alle bevindingen worden weergegeven.

Resources die gevalideerd kunnen worden, zijn Bundle en QuestionnaireResponse.

Bundle
profile inclusief version Met behulp van het profiel kunnen we bepalen volgens welke definitie is aangeleverd. geweigerd. Voorbeeld NOG INVOEGEN

Veel voorkomende validatiefouten bij overstap naar 2026Q1

De validatie van 2026 zijn veel stricter dan 2025, hierdoor komen meer fouten naar boven die eerder waren geaccepteerd. In deze hoofdstuk wordt uitgelegd wat de meeste fouten betekenen en wat eraan kan worden gedaan.

HAPI-0929: Failed to process conditional create. The supplied resource did not satisfy the conditional URL.

De waarde van de identiefier moet voldoen met de inhoud van de bundle.

Stel dat een bundle wordt verstuurd met de de URL: https://fhir.stichting-nice.nl/R4/Bundle?identifier=https://fhir.stichting-nice.nl/R4/identifier/3/1/admission%7C5432

De waarde van de identifier in de URL is dus: https://fhir.stichting-nice.nl/R4/Bundle?identifier=https://fhir.stichting-nice.nl/R4/identifier/3/1/admission%7C5432 De %7C is de URL-encoded teken van | , die de waarde verdeeld in twee delen:

  <identifier>
    <system value="https://fhir.stichting-nice.nl/R4/identifier/3/1/admission" />
    <value value="5432" />
  </identifier>

Element must have some content

Deze melding wordt altijd getoond met een locatie (regelnummer en kollomnummer).

Voorbeeld:

  <item>
    <linkId value="a_ado2" />
    <answer />
  </item>

Bij answer is value verplicht. Om geen waarde voor ad_odo2 te versturen, moet answer dus niet aanwezig zijn.

Correctie:

  <item>
    <linkId value="a_ado2" />
  </item>

Zie ook de cardinaliteit: https://build.fhir.org/questionnaireresponse.html

Ook incorrect:

  <item>
    <linkId value="decubitus" />
    <answer>
      <valueInteger />
    </answer>
  </item>
  <item>
    <linkId value="dis_hosp" />
    <answer>
      <valueDateTime />
    </answer>
  </item>
  <item>
    <linkId value="weight" />
    <answer>
      <valueQuantity>
        <value />
        <system value="http://unitsofmeasure.org" />
        <code value="kg" />
      </valueQuantity>
    </answer>
  </item>

The instant ‘‘2026-08-14T15:31:58.487’ doesn’t meet format requirements for instant)’ is not valid (by regex)

Een instant heeft een tijdzone nodig en voldoet hier dus niet aan de juiste formaat. In dit voorbeeld zou voor de zomerperiode dus de zone +02:00 moeten worden gebruikt.

Voorbeeld:

<timestamp value="2026-08-14T15:31:58.487" />

Correctie:

<timestamp value="2026-08-14T15:31:58.487+02:00" />

Structural Error: item with linkid burns is in the wrong place

De structuur en volgorde van een item is heel belangrijk en deze moet overeenkomen met de Questionnaire zoals die is gedefinieer op onze website onder resources: https://github.com/AmsterdamUMC/nice-fhir-qr-voorbeelden/tree/master/resources

Voorbeeld van mds:

    <item>
      <linkId value="bili" />
    </item>
  </item>
  <item>
    <linkId value="burns" />
    <answer>
      <valueBoolean value="false" />
    </answer>
  </item>

In de deze voorbeeld is te zien dat de item met linkid bili wordt afgesloten en daarna weer een item (mds) wordt afgesloten. De item met linkid burns zit dus niet in dezelfde niveau als bili in de item mds. Dat is dus fout, het bili is nu op dezelfde niveau als de item met linkid hospno, icno en admno, dat over alle mds records heen gaat.

Deze fout is te corrigeren door te verplaatsen naar de juiste locatie.

No response answer found for required item ‘isgevalideerd’

Als isgevalideerd niet op de juiste plek en ingevuld is, dan wordt deze melding getoond. De juiste plek wordt bepaald door de Questionnaire https://github.com/AmsterdamUMC/nice-fhir-qr-voorbeelden/tree/master/resources. Deze wordt MDS questionnaire verwacht na de item icno en voor de item mds. Zie hier Questionnaire voor MDS:

        {
            "linkId": "icno",
            "type": "integer",
            "required": true
        },
        {
            "linkId": "isgevalideerd",
            "type": "boolean",
            "required": true
        },
        {
            "linkId": "mds",
            "type": "group",
            "repeats": false,
            "item": [

LinkId ‘Eol_beadem_24’ not found in questionnaire

Voorbeeld:

    <item>
      <linkId value="Eol_beadem_24" />
      <answer>
        <valueInteger value="0" />
      </answer>
    </item>

LinkId zijn casesensitive, dus er wordt een onderscheid gemaakt tussen hoofdletters en kleinletters. In de Questionnaire staat:

    {
        "linkId": "eol_beadem_24",
        "type": "integer",
        "required": false
    },

De correcte manier van aanleveren is dus:

    <item>
      <linkId value="eol_beadem_24" />
      <answer>
        <valueInteger value="0" />
      </answer>
    </item>

Answer value must be of the type date

De types moeten overeenkomen met zoals gedefinieerd in de Questionnaire.

Voorbeeld:

  <item>
    <linkId value="date_of_birth" />
    <answer>
      <valueDateTime value="1900-01-01T00:00:00" />
    </answer>
  </item>

Questionnaire:

  {
      "linkId": "date_of_birth",
      "type": "date",
      "required": false
  },

De correcte manier van aanleveren is dus:

  <item>
    <linkId value="date_of_birth" />
    <answer>
      <valueDate value="1900-01-01" />
    </answer>
  </item>

Constraint failed: txt-2: ‘The narrative SHALL have some non-whitespace content’

Bij elke Questionnaire wordt tekst verwacht

  <text>
    <status value="empty" />
    <div xmlns="http://www.w3.org/1999/xhtml" />
  </text>

correctie:

  <text>
    <status value="empty" />
    <div xmlns="http://www.w3.org/1999/xhtml" >QR ten behoeve van de NICE</div>
  </text>

If a date has a time, it must have a timezone

DatTime moet ook een tijdzone hebben

  <item>
    <linkId value="adm_hosp" />
    <answer>
      <valueDateTime value="2026-08-12T12:44:00" />
    </answer>
  </item>
  <item>
    <linkId value="adm_hosp" />
    <answer>
      <valueDateTime value="2026-08-12T12:44:00+02:00" />
    </answer>
  </item>

Error processing unit ‘beats/min’: The unit ‘beats’ is unknown’ at position 0 (for ‘http://unitsofmeasure.org#beats/min')

De code moet exact dezelfde zijn zoals aangegeven in de Questionnaire

Voorbeeld:

    <item>
      <linkId value="heartrate_max" />
      <answer>
        <valueQuantity>
          <value value="150" />
          <system value="http://unitsofmeasure.org" />
          <code value="beats/min" />
        </valueQuantity>
      </answer>
    </item>

In de questionnaire staat gedefineer:

    {
        "linkId": "heartrate_max",
        "code": [
            {
                "system": "http://unitsofmeasure.org",
                "code": "{beats}/min"
            }
        ],
        "type": "quantity",
        "required": false
    },

Dus de correctie is:

    <item>
      <linkId value="heartrate_max" />
      <answer>
        <valueQuantity>
          <value value="150" />
          <system value="http://unitsofmeasure.org" />
          <code value="{beats}/min" />
        </valueQuantity>
      </answer>
    </item>

Echter deze verandering zal een warning geven in plaats van een error. In de nabije toekomst (voor 2026Q3 of 2027) zullen we deze eenheid aanpassen, zodat ook deze warning verdwijnt.

Structural Error: items are out of order

De volgorde van items moeten overeenkomen met die van de Questionnaire.

Voorbeeld waar het fout gaat:

  <item>
    <linkId value="hospno" />
    <answer>
      <valueInteger value="3" />
    </answer>
  </item>
  <item>
    <linkId value="icno" />
    <answer>
      <valueInteger value="1" />
    </answer>
  </item>
  <item>
    <linkId value="admno" />
    <answer>
      <valueInteger value="542" />
    </answer>
  </item>

In de Questionnaire staan items op dezelfde niveau alfabetisch:

    {
        "linkId": "admno",
        "type": "integer",
        "required": true
    },
    {
        "linkId": "hospno",
        "type": "integer",
        "required": true
    },
    {
        "linkId": "icno",
        "type": "integer",
        "required": true
    },

Dus correctie:

  <item>
    <linkId value="admno" />
    <answer>
      <valueInteger value="542" />
    </answer>
  </item>
  <item>
    <linkId value="hospno" />
    <answer>
      <valueInteger value="3" />
    </answer>
  </item>
  <item>
    <linkId value="icno" />
    <answer>
      <valueInteger value="1" />
    </answer>
  </item>

Answer value must be of the type Quantity

De antwoord moet van de type zijn zoals gedefineerd in de Questionnaire.

Voorbeeld:

      <item>
        <linkId value="sofa_kreat" />
        <answer>
          <valueInteger value="6" />
        </answer>
      </item>

Gedefinieerd in SOFA:

{
    "linkId": "sofa_kreat",
    "code": [
        {
            "system": "http://unitsofmeasure.org",
            "code": "umol/L"
        }
    ],
    "type": "quantity",
    "required": false
},

Correctie:

      <item>
        <linkId value="sofa_kreat" />
        <answer>
          <valueQuantity>
            <value value="6" />
            <system value="http://unitsofmeasure.org" />
            <code value="umol/L" />
          </valueQuantity>
        </answer>
      </item>

As specified by profile http://hl7.org/fhir/StructureDefinition/Quantity|4.0.1, Element ‘value’ is out of order (found after code)

De volgorde moet zoals gedefinieerd zijn in de FHIR specificatie: https://build.fhir.org/datatypes.html#quantity

Fout voorbeeld:

  <item>
    <linkId value="adre" />
    <answer>
      <valueQuantity>
        <system value="http://unitsofmeasure.org" />
        <code value="ug/kg/min" />
        <value value="6" />
      </valueQuantity>
    </answer>
  </item>

Correctie:

  <item>
    <linkId value="adre" />
    <answer>
      <valueQuantity>
        <value value="6" />
        <system value="http://unitsofmeasure.org" />
        <code value="ug/kg/min" />
      </valueQuantity>
    </answer>
  </item>

“LinkId ‘ai_farmaceutischproduct’ not found in questionnaire”

Alleen linkId die in de questionnaire zijn gevonden kunnen worden gebruikt. Het kan zijn dat niet naar de juiste questionnaire wordt verwezen.