ExpressionScript - presentation/nl

=Inleiding=

In LimeSurvey wordt de nieuwe expressiebeheer module (EM) gebruikt, waarmee LimeSurvey meer complexe vertakkingen, beoordelingen, validatie en maatwerk kan ondersteunen. Het vervangt hoe LimeSurvey de vervangingen, condities en beoordelingen op het beheerdeel beheert. Doordat er nu ook minder wordt gelezen in de database, betekent het ook een snellere werking. Expressie Beheer is ontworpen door Dr. Thomas White (TMSWhite).

Definities

 * 1) Expressie: Alles tussen accolades.
 * 2) *Er mogen geen spaties staan na de openings-accolade en voor de sluit-accolade.
 * 3) *De expressie wordt geëvalueerd door EM, het kan mathematische formules, functies en complexe string- en gegevensverwerking bevatten.
 * 4) Maatwerk: Ook wel "tailoring" en "piping" genoemd. Het conditioneel wijzigen van tekst.
 * 5) *Je hebt toegang tot alle "vervangingsvelden", deelnemersgegevens en gegeven antwoorden.
 * 6) *Je hebt eenvoudiger toegang tot vragen, antwoorden en eigenschappen.
 * 7) Relevantie vergelijking: Een attribuut om de zichtbaarheid te controleren.
 * 8) *Als er een relevantievergelijking is dan wordt de vraag alleen getoond bij de uitkomst true.
 * 9) *Intern worden alle array_filter en array_filter_exclude commando's omgezet in relevanties op subvraagniveau.
 * 10) SGQA:  De oude naamgeving van variabelen in LimeSurvey (t/m 1.91+).
 * 11) *Staat voor Survey-Group-Question-Answer
 * 12) * SGQA variabele-naam ziet eruit als 123X5X382X971, en kan ook door een subvraag achtervoegsels hebben.
 * 13) *De getallen in de naam verwijzen naar de codes van de enquête, de groep, de vraag en het antwoord en kunnen dus noodzakelijk gewijzigd moeten worden bij een aanpassing in de enquête.
 * 14) Vergelijking: Het vraagtype vergelijking slaat berekeningen of rapporten op in de database.
 * 15) *Het is als een Boilerplate vraag, maar de inhoud wordt opgeslagen in de database, ook als je deze vraag altijd verbergt.
 * 16) Vraagcode: De in EM te gebruiken variabele-naam.
 * 17) *Dit kan een beschrijvende naam zijn met het doel van de vraag, hierdoor is de code gemakkelijker leesbaar.
 * 18) *Een vraagcode begint NOOIT met een cijfer, als je nummers gebruikt om je vragen te nummeren gebruik dan eerst altijd een letter, bijvoorbeeld "q1", "q1a" of "g1q2".
 * 19) *Als je gegevens gaat exporteren naar SPSS of R wordt deze naam gebruikt. Zorg ervoor dat je de vraagcodes in de enquête uniek houdt.

Moet ik Expressiebeheer gebruiken?
Nee, je hoeft EM niet te gebruiken, maar als je enquête wat meer complex wordt, dan is het wel handiger.

De Conditie-editor ondersteunt bijvoorbeeld ook wat eenvoudige expressies die je bij je vragen kunt gebruiken. In EM wordt veel meer  ondersteund.

Kan ik condities en relevantievergelijkingen in een enquête gebruiken?
Ja. Je kunt bij de ene vraag de Conditie-editor gebruiken en bij een andere een Relevantievergelijking.

Maar je kunt ze niet beide in dezelfde vraag gebruiken! Als je een conditie maakt dan gaat de expressie in de relevantievergelijking verloren. Bovendien kan het veld van de relevantievergelijking niet meer handmatig worden aangepast.

Met wat rommelen kan het je wel lukken, maar waarom zou je dat willen. Je moet dan de relevantievergelijking in een editor bewaren. Verwijder dan de nieuwe conditie in de Conditie-editor en wijzig de vraag door de expressie van de conditie gecombineerd met de bewaarde relevantievergelijking in te vullen.

Kiezen tussen conditie en relevantie
Een lijst van voordelen en nadelen van beide:

=Beginnen=

Als je met EM wilt beginnen:
 * Installeer dan eerst de meest recente stabiele versie van https://www.limesurvey.org/en/download als je niet de meest recente versie gebruikt of gebruik daarvoor ComfortUpdate.
 * Importeer en probeer wat voorbeelden van enquêtes.
 * Bekijk de use-cases en gebruikstips, en de voorbeelden.
 * Bestudeer deze pagina, de EM documentatie.
 * Unit-tests van geïsoleerde expressies (expert)
 * toont voorbeelden van gebruik van alle EM-functie en operators, en de PHP en JavaScript resultaten.
 * er zijn een paar functies die in PHP/JavaScript een ander resultaat geven, bekijk deze pagina dus goed.

=Terminologie=

De mogelijkheden van EM:
 * Relevantie gebaseerde vertakking - als een vraag relevant is, stel dan die vraag (en stel anders de vraag niet, verberg de vraag en sla NULL op in de database). In het wijzigingsscherm van de vraag en de vraaggroep staan meestal de Relevantie velden. Je kunt op de vraaggroep een conditie zetten die voor alle vragen van de groep geldig is, dan hoef je die niet bij elke vraag te zetten en te wijzigen.
 * Maatwerk - Hiermee kun je de vraag aanpassen. Je kunt met maatwerk (ook tailoring en piping genoemd) niet alleen eenvoudige vervangingen doen (bijvoorbeeld {TOKEN:FIRSTNAME}) gebruiken, maar ook gebruik van werkwoorden of woorden op grond van sexe of aantal. Je kunt de tekst ook aan een deelnemer aanpassen op grond van eerder gegeven of niet gegeven antwoorden.
 * Vergelijkingen - In EM is er een vraagtype Vergelijking toegevoegd waarmee het resultaat van een expressie wordt opgeslagen in de database, ook als de vraag is verborgen. Ze worden gebruikt voor het verbergen van berekeningen, tussenresultaten, navigatie op basis van complexe vergelijkingen, beoordelingen en rapporten die aangemaakt gaan worden en opgeslagen.

Relevantie en trapsgewijze relevantie
Elk vraagtype heeft een optie relevantie die bepaald of de vraag moet worden gesteld. Ze worden verwerkt in de volgorde dat ze in de enquête staan. Als de expressie waar is (of ontbreekt, dit om oudere enquêtes te blijven ondersteunen) dan wordt de vraag gesteld. Als de vraag niet gesteld wordt dan wordt de waarde NULL opgeslagen. Als er geen enkele relevante vraag in de groep is, dan wordt de hele groep overgeslagen.

Als een van de variabelen in de expressie niet relevant is, dan is die vraag niet relevant. Dit is dus een trapsgewijze relevantie waardoor je niet hele lange relevantievergelijkingen voor elke vraag hoeft te schrijven.

Stel je hebt 5 vragen Q1-Q5, en je wilt alleen vraag Q2 stellen als vraag Q1 beantwoord is. Ook wil je vraag Q3 alleen stellen als vraag Q2 beantwoord is. De relevantievergelijkingen kunnen dan zijn:

Relevantie op groepsniveau
Expressiebeheer (EM) ondersteunt ook relevantie op groepsniveau. Hierdoor is de implementatie van looping (herhalen) gemakkelijker. Stel je wilt informatie van 10 mensen in een huishouden of van 10 producten opvragen. Je bepaalt dan eerst hoeveel mensen er in een betreffende huishouden zijn of hoeveel producten de deelnemer uit een lange lijst heeft geselecteerd. Je kunt dan daarna de relevantie van het groepsniveau gebruiken. {count >= 1}, {count >=2}, ... {count >= 10} voor elk van de 10 groepen. In elke groep kun je dan op vraagniveau nog testen op condities (bijv. sexe, leeftijd per elk lid van het huishouden). De relevantie van vraaggroep wordt dan per vraag gecombineerd (met AND) om te bepalen of de vraag relevant is.

We hebben een voorbeeld, dat je kunt [[Media:EM survey - Cohabs.zip|importeren]].

In de onderstaande afbeelding kun je zien dat de groep Person 1 relevant is als de deelnemer samenleeft met minstens een ander persoon:



Maatwerk
Alles tussen accolades wordt beschouwd als een expressie (met een uitzondering die hieronder wordt beschreven). Expressies kunnen beschikken over alle vervangingsvelden, alle variabelen (via verschillende aliassen), alle vergelijkingsoperatoren (rekenkundig, logisch en vergelijkend) en veel functies (die ook dynamisch op de server uitgevoerd kunnen worden).

Met deze vergelijkingen kun je dingen doen als:
 * 1) Conditioneel tonen van op maat gesneden berichten aan de respondenten die gebaseerd zijn op antwoorden op voorafgaande vragen.
 * 2) Beoordelingen maken en de resultaten daarvan conditioneel tonen (of conditioneel een vertakking maken), alles zonder de module beoordeling te gebruiken.
 * 3) De goede werkwoordsnormen en zelfstandige naamwoorden gebruiken in vragen, antwoorden en rapporten.
 * 4) Tonen van samenvattingen van antwoorden bij het einde van de enquête.

Vergelijkingen
Er is een vraagtype Vergelijking toegevoegd. Het lijkt op het Tekst scherm vraagtype, maar bij het nieuwe vraagtype wordt de waarde of wat er wordt getoond, opgeslagen in de database. Dus, als de tekst van een vergelijking vraag een berekening van een beoordeling bevat, dan wordt die waarde opgeslagen in een variabele die getoond kan worden bij statistieken.

=Syntax=

De uitzondering op dat alles tussen accolades een expressie is, is dat er geen spatie(s) na de begin-accolade en voor de sluit-accolade mogen staan. Dit is nodig om te voorkomen dat expressiebeheer probeert JavaScript te gaan verwerken.

NB: Expressies mogen meerdere regels bevatten, zolang er maar geen spaties staan na een openingshaakje of voor een sluithaakje. Een voorbeeld met een genest if statement:

Expressiebeheer gebruikt de volgende syntax:
 * Alle standaard mathematische operatoren (+,-,*,/,!).
 * Alle standaard vergelijkingsoperatoren (<,<=,==,!=,>,>=, en ook: lt, le, eq, ne, gt, ge).
 * Haakjes (zodat je subexpressies kunt groeperen).
 * Conditionele operatoren (bijv. &&,| | en ook: and, or).
 * Strings tussen enkele of dubbele aanhalingstekens (quotes), dit kunnen strings zijn met de andere manier van aanhalingstekens.
 * Komma operator (je kunt dan een lijst expressies gebruiken en alleen het resultaat terugkrijgen).
 * Toekenningsoperator (=);
 * Voorgedefinieerde variabelen (refereren aan vragen of vraagattributen of antwoorden), bijv. de SGQA-codes;
 * Functies (meer dan 80 beschikbaar, en het is uitbreidbaar).

Operatoren
De volgorde van verwerken van operatoren is normaal.

Waarschuwing met niet-overeenkomend nummer en string en alfabetische / numerieke vergelijking
Wanneer je waarden wilt vergelijken met relatieve of gelijkheid, let dan op mismatch. De door de gebruiker ingevoerde waarde of de geselecteerde antwoordcode kan als getal worden gebruikt als het duidelijk een getal is. Als je een van de waarden omringt met  : forceer je een vergelijking als tekst. Als je wilt vergelijken als getal, zet het getal dan niet tussen.

Voorbeeld:  is TRUE als Q0.NAOK een numerieke vraag is met 9 als waarde. Dit komt omdat de operator  ervan uitgaat dat het een alfabetische vergelijking is en dus geen numerieke vergelijking.

Om er zeker van te zijn dat de invoer als getallen worden vergeleken kun je het volgende doen , bedenk dat als Q0.NAOK geen getal is  (leeg of een string), dat dan intval(Q0.NAOK) === 0. Gebruik om als strings te vergelijken ("A" < "B") strcmp :   of.

Uitkijken met gebruik operator (=)
Probeer het gebruik van de toekenningsoperator te vermijden, want er kunnen gemakkelijk onverwachte bijwerkingen zijn. Als je de waarde van een vorig antwoord wijzigt wordt de trapsgewijze relevantie en logica tussen die vraag en de huidige vraag niet opnieuw bepaald, hierdoor kunnen de gegevens niet consistent worden. (De vragen kunnen dan als beantwoord blijven staan en niet op NULL gezet zijn in de database. Of dat vragen die dan verplicht zijn niet gesteld zijn en op NULL staan). Gebruik in het algemeen het vraagtype Vergelijking om een variabele een waarde te geven met een expressie. Heel soms heb je de toekenningsoperator echt nodig, dus is die operator beschikbaar.

Om het gebruik van de operator toekennen wat duidelijker aan te geven, tonen we het in rode tekst in de syntaxvergelijking. (Verwar deze operator niet met de gelijkheidsvergelijking "==".)



Gebruik toekenningsoperator
De belangrijkste redenen om deze operator te gebruiken:
 * Je wilt een standaardwaarde zetten voor een vraag, waar dat niet met een expressie kan (een radiolijst, waar kun je een van de antwoorden selecteren maar geen vergelijking kan invoeren).  Wees voorzichtig, want LimeSurvey kan niet valideren dat je vergelijking een goed antwoord voor die vraag oplevert.
 * Je wilt het antwoord van een vorige vraag aanpassen op grond van een later gegeven antwoord.
 * enz.

Je kunt voor dit doel Expressiebeheer gebruiken, maar het is beter om het vraagtype vergelijking te gebruiken.

Voorbeeld:
 * Zet het antwoord op een korte tekstvraag in kleine letters :
 * Zet een standaardantwoord voor het vraagtype array bij het starten van de enquête :
 * Zet een standaardantwoord voor het vraagtype array (tekst) bij het begin van de enquête :
 * Zet een conditie op een antwoord:

=XSS beveiliging=

Als XSS is ingeschakeld kunnen enkele delen van Expressiebeheer niet worden gebruikt:
 * een HTML-tag in een expressie laten starten en in een andere afsluiten.
 * een URL in de expressie.

Voorbeeld en alternatief
 * is gebroken met XSS-beveiliging, je kunt hier gebruiken
 * , hier kun je een vergelijkingsvraag gebruiken omdat een het gebruik van een volledige vraagcode is toegestaan :

=Toegang tot variabelen=

Expressiebeheer geeft alleen leesrecht op de beschikbare variabelen. Om voorgaande versies te blijven ondersteunen, is er toegang tot:
 * TOKEN:xxx - de waarde van een TOKEN (bijvoorbeeld TOKEN:FIRSTNAME (voornaam), TOKEN:ATTRIBUTE_5 (attribuut_5)) (Alleen voor NIET anonieme enquêtes.)
 * |INSERTANS:SGQA - de te tonen waarde van een antwoord, bijvoorbeeld "Ja". Voor Expressiebeheer is het gelijk aan het gebruik van {QCODE.shown}.
 * Alle {XXX} waarden gebruikt in sjablonen.
 * In de vraagtekst, kun je {QID} gebruiken voor het ID van de vraag en {SGQ} voor de SGQA van de vraag.

Verder kun je in Expressiebeheer aan de variabelen refereren met de Vraagcode (de kolom 'titel' in de database-tabel questions). Dit is ook de naam die gebruikt wordt bij het exporteren naar SPSS, R, en SAS. Voorbeeld: als je vragen hebt over de name, leeftijd en geslacht dan kun je die variabelen benaderen met naam, leeftijd en geslacht in plaats van 12345X13X22, 12345X13X23 en 12345X13X24. De vergelijkingen zijn dan de enquête-maker gemakkelijker te lezen en te controleren, ook kun je vragen gemakkelijker verplaatsen omdat je niet afhankelijk bent van het nummer van de groep of de vraag.

Belangrijk: Het is veiliger om alleen variabelen te gebruiken die op voorgaande pagina's of vragen aangemaakt zijn.

Je kunt in EM verder nog de eigenschappen van de vraag lezen:

HTML-editor probleem
Als je de HTML-editor gebruikt worden sommige tekens vervangen door HTML.
 * & door &amp;amp;
 * < door &amp;lt;
 * > door &amp;gt;

Als je de HTML-editor gebruikt, gebruik dan:
 * and voor &
 * lt voor <
 * le voor <=
 * gt voor >
 * ge voor >=

Wij raden aan dat je in je expressie geen HTML gebruikt. Als je de LimeSurvey HTML-editor gebruikt, klik dan op de knop "Source" (linksboven) en verwijder alle tekens die niet bij je expressie horen  (bijv.:, , ...).

=Naamgeving Qcode Variabele=

Dit zijn de details per vraagtype die je nodig hebt om een Qcode te maken (en enkele eigenschappen te benaderen). In het algemeen worden Qcodes samengesteld als volgt:

VraagCode. '_' . SubvraagID. '_' . SchaalId

Voor commentaar en anders zijn de overeenkomende vraagcodes resp. VraagCode_comment en VraagCode_other.

=Het gebruik van NAOK=

NAOK --> "Not Applicable" (Niet van toepassing) is OK (goed)

Bij gebruik van NAOK zijn sommige variabelen niet meer van belang, ("Not Applicable OK").

Voorbeeld : count(Q1_SQ1,Q1_SQ2,Q1_SQ3,Q1_SQ4) geeft altijd een lege string als een subvraag van Q1 wordt gefilterd. Om het aantal gecontroleerde subvragen in dergelijke vraag te tellen: count(Q1_SQ1.NAOK,Q1_SQ2.NAOK,Q1_SQ3.NAOK,Q1_SQ4.NAOK). Indien de subvraag is verborgen heeft Expressiebeheer een lege string terug.

Zonder NAOK : als een vraag of een subvraag is verborgen, geeft Expressiebeheer een lege string terug, dat komt overeen met false.

Bij .shown wordt altijd het NAOK-systeem gebruikt (lege string als verborgen). Als u de antwoordcode wilt hebben, is het altijd goed om .NAOK toe te voegen aan de vraagcode.

Meer informatie over overriding trapsgewijze condities.

=Gereserveerde variabelen ('this','self','that')=

Je wilt vrij vaak alle delen van een vraag evalueren, zoals hoeveel subvragen zijn beantwoord of de totalen van de scores bepalen. Soms wil je alleen bepaalde rijen of kolommen verwerken van een vraag (bepalen van de som van een rij en kolom en dat getal opslaan in de database). De gereserveerde variabelen vereenvoudigen dat.

"This" variabele
De "this" variabele wordt alleen gebruikt in de opties "hele vraag validatievergelijking" en  "subvraag validatievergelijking" (de laatste kan niet via de GUI). Het wordt geëxpandeerd naar de variabele-namen voor elke cel binnen die vergelijkingen. Als je dus wilt controleren of elke invoer groter dan drie is, dan kun je de "Subvraag validatievergelijking" zetten op (this > 3).

"Self" variabele
De "self" en "that" variabele zijn krachtiger, ze zijn macro's die uitgevoerd worden voordat de vergelijkingen verwerkt worden. De syntax is:
 * self
 * self.suffix
 * self.sub-selector
 * self.sub-selector.suffix


 * 1) suffix is een van de normale qcode achtervoegsels (NAOK, value, shown)


 * 1) de sub-selector is een van de volgende:
 * comments - alleen subvragen die commentaar zijn (bijv.  Meerkeuzevraag met opmerkingen en Lijst met opmerkingen)
 * nocomments - alleen subvragen die geen commentaar zijn.
 * sq_X - waarbij X staat voor een rij of kolom identifier.  Alleen subvragen met patroon X worden geselecteerd. De code identifier moet volledig zijn, dan komt sq_X overeen inclusief subvragen nX, X, Xn (bijv. als je gebruikt sq_1 en subvragen a1, 1a, 1, 11 of 001 was inclusief). Let op bij het vraagtype Dubbele Schaal waar de codes van de subvragen zijn QCODE_SQCODE_1 en QCODE_SQCODE_1 en het vraagtype Rangschikken waar de codes van de subvragen zijn QCODE_1,QCODE_2 ....

Voorbeelden:
 * Is elk deel van de vraag beantwoord?  {count(self.NAOK)>0}
 * Wat is de beoordelingsscore voor deze vraag?  {sum(self.value)}

Je kunt dit ook gebruiken om rij- en kolomtotalen te bepalen. Stel je hebt een array met rijen A-E en kolommen 1-5.
 * Wat is het totaal?  {sum(self.NAOK)}
 * Wat is het totaal van rij B?  {sum(self.sq_B.NAOK)}
 * Wat is het totaal van kolom 3? {sum(self.sq_3.NAOK)}

"That" variabele
De "that" variabele is als de "self" variabele, maar je kunt refereren aan andere vragen. De syntax is:
 * that.qname
 * that.qname.suffix
 * that.qname.sub-selector
 * that.qname.sub-selector.suffix

qname is de naam van de vraag zonder de extensie van een subvraag. Dus als een je vraag 'q1' hebt, dan is dat de qname.

Voorbeelden:
 * Is elk deel van de vraag q1 beantwoord?  {count(that.q1.NAOK)>0}
 * Wat is de beoordelingsscore voor q2?  {sum(that.q2.NAOK)}
 * Wat is het totaal van q3? {sum(that.q3.NAOK)}
 * Wat is het totaal van rij C in q4?  {sum(that.q4.sq_C.NAOK)}
 * Wat is het totaal van kolom 2 in q4? {sum(that.q4.sq_2.NAOK)}

De self en that variabelen kunnen worden gebruikt in elke relevantie, validatie of maatwerk.

De valkuil is dat als je toon logica bestand gebruikt, je dan de geëxpandeerde waarde ziet van "self" en "that". Je ziet dan dus de actuele vergelijking die gegenereerd wordt zodat je (en expressiebeheer) kunt valideren of de variabelen bestaan. Omdat je dan hele lange vergelijkingen kunt zien, kan dat verwarrend zijn. Als je de vraag gaat wijzigen, zie je wel de originele vergelijking met de variabelen "self" en/of "that".

=Toegang tot functies=

Expressiebeheer ondersteunt het gebruik van de onderstaande functies inclusief door de gebruiker gedefinieerde functies. Je kunt dus zelf functies toevoegen. Het heeft PHP en JavaScript tegenhangers voor de onderstaande functies, zodat ze op de server (PHP) en de cliënt (JavaScript) gelijk werken.

Geïmplementeerde functies
De volgende functies zijn beschikbaar:

=Expressiebeheer weet wat de lokale variabelen zijn=

Om de JavaScript op een pagina goed op te bouwen, moet Expressiebeheer weten welke variabelen op de pagina staan en wat hun JavaScript ID is (bijvoorbeeld voor document.getElementById(x)). Het moet ook weten welke variabelen op andere pagina's worden gebruikt (zodat het zeker is dat de nodige  velden aanwezig en gevuld zijn).

Trapsgewijze condities
Als een van de variabelen niet relevant is, wordt de hele vergelijking niet relevant (false). Bijvoorbeeld, in de onderstaande tabel betekent N/A dat een van de variabelen niet relevant was.

Overslaan trapsgewijze condities
Stel je wilt een lopend totaal tonen van alle relevante antwoorden. Je kunt de vergelijking {sum(q1,q2,q3,...,qN)} proberen. Echter dit wordt intern vertaald naar LEMif(LEManyNA('q1','q2','q3',...,'qN'),'',sum(LEMval('q1'),LEMval('q2'),LEMval('q3'),...,LEMval('qN'))). Dus als een van de waarden q1-qN niet relevant is, krijg je altijd als resultaat false. De sum is zolang niet alle vragen zijn beantwoord altijd 0.

Om dit probleem te voorkomen, kan elke variabele een achtervoegsel ".NAOK" krijgen (dat betekent dat niet toepasbaar goed is Not Applicable is OK). Dat leidt dan tot het volgende gedrag. Stel je hebt een variabele q1.NAOK
 * 1) q1 wordt niet toegevoegd aan de LEManyNA clause
 * 2) LEMval('q1') blijft controleren of het antwoord relevant is en geeft "" terug als het niet relevant is (dus individuele niet relevante antwoorden worden overgeslagen, maar ze hebben geen invloed op de gehele expressie).

Dus de te gebruiken vergelijking voor het lopende totaal is: sum(q1.NAOK,q2.NAOK,q3.NAOK,...,qN.NAOK).

Het gebruik van het achtervoegsel .NAOK maakt het voor de maker van de enquête ook mogelijk om verschillende paden te hebben en die later te laten samenkomen. Een voorbeeld: onderwerpen in een enquête wijken af van de normale reacties. Deze resultaten kunnen worden opgemerkt door de enquêtebeheerder, die kan dan een bevestiging vragen of de deelnemer wil doorgaan met het invullen van de enquête. De conditie voor het "restant van te stellen vragen" zal dan testen of de initiële antwoorden normaal zijn OF dat het onderwerp een vraag heeft bevestigt dan alleen relevant is als het afwijkt van het normale antwoord.

=Hoe wordt conditioneel micro-maatwerk ondersteund?=

Dit is een voorbeeld van micro-maatwerk (waar Vraagtype == 'expr' betekent als het vraagtype vergelijking is):

Bovenstaand voorbeeld in het Engels met aantal kinderen [[Media:No_of_kids_-_Micro_Tailoring.zip|downloaden]].

Al deze vragen kunnen op dezelfde pagina (dus in een groep), alleen de relevante vragen worden getoond. Bovendien worden, als de leeftijden van de kinderen worden ingevoerd, de sum expressie in de laatste vraag dynamisch op de pagina gewijzigd.

Expressie beheer zorgt voor deze functionaliteit door elke expressie in een  element met een bepaalde naam te zetten. Elke keer als een waarde wijzigt wordt de expressie in dat  element opnieuw bepaald. Er is geen beperking in het aantal van dergelijke micro-maatwerk expressies op een pagina.

=Syntax markeren=

Als ondersteuning bij het invoeren en valideren van expressies wordt de syntax met kleur gemarkeerd volgens de regels:

Manieren van markeren en hun betekenis
=Leesvoer=