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

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 = 'æ')


Eksempel 2:

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

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

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

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

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