XPath og logik i blanketter
Blanketter i Blanketmotoren er bygget op som XML-data og Orbeon Forms, der ligger i kernen af Blanketmotoren understøtter en masse muligheder for at indlejre logik i de enkelte blanketter via sproget XPath. Logikken kan bruges til en lang række til, bl.a.
Felter med beregnede værdier baseret tidligere indtastninger
Validering af brugerinput
Vise/skjule felter
Gøre felter skrivebeskyttede
Indholdsfortegnelse
Hvad er XPath?
XPath er et sprog, der anvendes til at navigere mellem elementer og attributter i et XML dokument.
Læs en kort introduktion til Xpath her.
Ønsker I at dykke længere ned i redigering af XML, kan vi anbefale Notepad++, der er et gratis redskab til koderedigering.
Brug af felter i formler
I standard XPath vil man normalt henvise til værdien af et felt ved brug af to skråstreger, eksempelvis //felt1 med risiko for at pege på flere felter.
I Orbeon skal felter dog have et unikt navn og de har derfor indført en separat notation med brug af $-tegn som er nemmere at bruge, eksempelvis $felt1
Eneste undtagelse for ovenstående er brug af felter fra section templates, da man kan have den samme template flere gange i en blanket og feltnavnene derfor ikke vil være unikke. Her skal du i stedet pege på både sektionens og feltets navn, som følger $sektion1//felt1
XPath operatorer
Operator | Beskrivelse | Eksempel |
---|---|---|
+ | Addition af værdier
| 6 + 4 $felt + $felt2 |
- | Subtraktion af værdier | 6 - 4 $felt1 - $felt2 |
* | Multiplikation af værdier | 6 * 4 $felt1 * $felt2 |
div | Division af værdier | 6 div 4 $felt1 div $felt2 |
= | Lighedsudtryk | $felt1/text() = ‘abc’ $skiftkommune = 'ja' |
= ( ) | Tjek om værdien ligger i en liste | $felt1 = ('a', ‘b', 'c’) |
contains | Tjek om feltets værdi indeholder en del | contains($felt1, 'a') |
!= | Ikke-lighedsudtryk | $beloeb != 1000 $felt2 != $felt1 |
< | Mindre end | $beloeb < 5000 |
<= | Mindre end eller lig med | $beloeb <= 5000 |
> | Større end | $beloeb > 5000 |
>= | Større end eller lig med | $beloeb >= 5000 |
or | Eller – enten det ene eller det andet udtryk skal være opfyldt | $beloeb > 5000 or $momsfri = 'ja' |
and | Og – begge udtryk skal være opfyldt | $beloeb < 5000 and $told != 'nej' |
not | "not" kan bruges til at validere, hvis et udtryk ikke opfyldes | Eksempel 1: I følgende valideres der, hvis feltets indhold er "æ": $control-1 = 'æ' I følgende valideres der ikke, hvis feltet er "æ": not ($control-1 = 'æ')
I følgende valideres der, hvis feltet indeholder "æ": contains($control-1, 'æ') I følgende valideres der, hvis feltet ikke indeholder "æ": not (contains($control-1, 'æ')) |
Eksempler på valideringsregler
Blanketmotoren tilbyder rig mulighed for at opsætte valideringsregler på de enkelte felter i blanketten
Datoer
De mest almindelige valideringsregler på datofelter går på, hvorvidt en dato ligger før eller efter en anden dato, eksempelvis dags dato.
I tabellen nedenfor ses et par eksempler på, hvordan valideringsregler for datoer kan se ud
Regel | Formel |
---|---|
Dato må ikke være efter 22. juni 2022 | . <= xs:date('2022-06-22') |
Dato skal være før 22. juni 2022 | . < xs:date('2022-06-22') |
Dato må ikke være efter dags dato | . <= current-date() |
Dato må ikke være mere end 7 dage efter dags dato | days-from-duration(. - current-date()) <= 7 |
Dato er den første i en måned | substring(string(.), 9, 2) = '01' |
Tekstfelter
De mest almindelige valideringsregler på tekstfelter går på enten længden af feltet eller hvorvidt værdien af feltet har et bestemt mønster, eks. 8 cifre til et CVR-nummer.
Længden af feltet kan valideres med indbyggede valideringsregler i Orbeon, mens at formatet af et tekstfelt kan valideres ved at bruge såkaldte Regex-udtryk (Regular expression ) og functionen matches som i eksemplerne nedenfor
Regel | Formel |
---|---|
CVR- eller telefonnummervalidering (8-cifre) | matches(., '^\d{8}$') |
CPR-validering (6 + 4 cifre med bindestreg) | matches(., '^\d{6}-\d{4}$') |
CPR-validering (6 + 4 cifre uden bindestreg) | matches(., '^\d{10}$') |
CPR-validering (6 + 4 cifre og valgfri bindestreg) | matches(., '^\d{6}-?\d{4}$') |
Kun bogstaver og tal | matches(., '^[A-Za-z0-9]+$') |
Kun bogstaver | matches(., '^[A-Za-z]+$') |
Når man skal til at lave disse Regex-udtryk til sine valideringer, så kan et værktøj som eksempelvis regex101: build, test, and debug regex være nyttigt til at teste og forstå, hvad de enkelte dele af udtrykket betyder. Du finder et Regex cheatsheet her: Regex cheatsheet
Tjekbokse
Hvor dropdowns og radio buttons bar har en enkelt strengværdi og derfor kan valideres med de generiske operatorer beskrevet ovenfor, så opfører tjekbokse sig lidt anderledes
Regel | Formel |
---|---|
Single-checkbox er markeret | . = true() |
Single-checkbox er ikke markeret | . = false() |
Værdien A er valgt blandt flere tjekbokse | contains(., 'A') |
Mindste to valgmuligheder valgt | count(xxf:split(., ' ')) >= 2 |
Vedhæftninger
På vedhæftningsfelter er der lidt anderledes muligheder for valideringsregler, som gør det nemt at validere på størrelse og type af vedhæftninger
Hent data fra brugerens login
Blanketmotoren giver mulighed for, at du kan hente visse værdier ud fra brugerens login, som eksempelvis CPR eller CVR-nummer og bruge dette direkte i blanketterne i stedet for at lade brugeren indtaste værdierne selv.
Formlerne bør altid indsættes under Initial Value i feltet
I tabellen nedenfor ses en oversigt over de tilgængelige værdier, og hvilke logins de matcher:
Værdi | Indhold | Personlig MitID | MitID Erhverv | Personligt eID | eID Business |
---|---|---|---|---|---|
xxf:get-request-attribute('nemlogin-id') | Loginet's ID | X | X | X | X |
xxf:get-request-header('x-sector9-saml-commonname') | Brugerens navn | X | X | X | X |
xxf:get-request-header('x-sector9-saml-mail') | Brugerens mail, hvis oplyst | (X) | (X) | (X) | (X) |
xxf:get-request-header('x-sector9-saml-cvrnumberidentifier') | CVR-nummer hørende til brugerens medarbejdersignatur. Kan også trækkes fra personligt NemLog-in for enkeltmandsvirksomheder og lignende |
| X |
|
|
xxf:get-request-header('x-sector9-saml-cprnumberidentifier') | Brugerens CPR-nummer | X | X |
|
|
xxf:get-request-header('x-sector9-saml-legalpersonidentifier') | ID på medarbejder eID |
|
|
| X |
xxf:get-request-header('x-sector9-saml-personidentifier') | ID på personlig eID |
|
| X |
|
xxf:get-request-header('x-sector9-saml-birthdate') | Brugerens fødselsdag | (X) | (X) | (X) | (X) |
X = Værdien vil altid hente et resultat på signaturtypen
(X) = Værdien vil nogen gange hente et resultat på signaturtypen
Avancerede XPath funktioner
Hvis du savner yderligere eksempler på brug af XPath i blanketter, så kig på siden Avancerede XPath operationer for mere inspiration