Tekstgenerator-skript for XML/JSON-filer

Tekstgenerator-skript for XML/JSON-filer

Designet til Compose har blitt oppdatert. Siden kan inneholde skjermbilder av det gamle designet, men informasjonen er oppdatert. Vi takker for din tålmodighet mens vi oppdaterer bildene!

English

Denne veiledningen viser flere eksempler på hvordan du skripter og bearbeider prosessinformasjon i tekstgeneratorer. Disse tekstgeneratorene kan brukes til enhver tekstgenererings-aktivitetet, men denne veiledningen demonstrerer hovedsakelig koding av output-filer i XML (de samme prinsippene gjelder for JSON og andre formater). En oversikt over de mest brukte metodene/operatorene i Compose-kode finner du i dette oppslagsverket https://composetogo.atlassian.net/wiki/spaces/CNGD/pages/1835183.

Det første steget du tar i Tekstgeneratorbyggeren er å definere inn-variablene. Når vi genererer en tekstfil henviser vi til inn-variabler som er koblet til informasjon fra prosessen (som f.eks. skjemasvar).

Naviger til Skript-menyen. Der finner du et skriptvindu hvor du kan skrive inn fritekst. Her henviser vi til inn-variabler og har anledning til å implementere logikk for ytterligere databearbeiding og formatering.

Du henviser til inn-variabler med ${}-syntaks ved å sette variabelen mellom krøllparantesene. Den tilknyttede verdien til variabelen vil erstatte ${}-syntaksen når filen genereres.

Tekstgenerator-skript

<kontaktInformasjon> <navn>${navn}</navn> <alder>${alder}</alder> </kontaktInformasjon>

Generert tekst

<kontaktInformasjon> <navn>Peter Person</navn> <alder>58</alder> </kontaktInformasjon>

Hvordan du forholder deg til inn-variablene i skriptet avhenger av variabel-typen. I eksempelet over har både navn og alder typen verdi. Prosessverdiene som disse inn-verdiene får, defineres i prosessen. F.eks. i en Opprett fil-aktivitet kobles verdiene til prosessen i Variabler-menyen, tilgjengelig gjennom Inputvariabler-knappen.

Eksempelet over viser koblingen mellom inn-variablene fra tekstgeneratoren og skjemasvarene fra skjema-aktiviteten Skjema 1 (vi kommer tilbake til inn-variabelen kontaktSkjema, som er koblet til et helt skjema). Svar avgitt av skjemautfylleren blir dermed satt inn i inn-variablene og videre inn i den genererte filen.

Groovy-kode i tekstgeneratorer (scriptlets)

I tillegg til henvisning til inn-variabler kan Groovy-kode implementeres med <% %>-syntaks. Du kan legge til Groovy-kode mellom <% %>-notasjon for å generere ny informasjon, slik som vist her:

Tekstgenerator-skript

<% def erPensjonist(alder) { return alder > 65 } %> <kontaktInformasjon> <navn>${navn}</navn> <alder>${alder}</alder> <% if (erPensjonist(alder)) { %> <pensjonist>Ja</pensjonist> <% } %> </kontaktInformasjon>

Generert tekst

<kontaktInformasjon> <navn>Marie McLady</navn> <alder>$111</alder> <pensjonist>Ja</pensjonist> </kontaktInformasjon>

Vi har definert en funksjon erPensjonist som brukes senere i skriptet. Som vist i eksempelet, kan Groovy-kode flettes inn mellom normale tekst-avsnitt. Viktig: Koden inne i <% %> påvirker ikke den genererte teksten, mens kode inni ${}-syntaks påvirker den genererte teksten.

Skript med Skjema-variabler

Typen til inn-variabler bestemmer hvordan vi kan behandle inn-variablene i skriptet. De tre typene en inn-variabel kan ha er verdi, skjema og liste. Når du har en skjema-variabel kan du henvise til alle spørsmålssvar i et helt skjema. Følgende er et skript med skjema-variabelen personalForm: (kode-eksemplene vil fremover være på engelsk, da kombinasjonen av norske variabler og engelske funksjoner ikke blir lett å lese)

Tekstgenerator-skript

<contactInformation> <name>${personalForm.Q1.answer}</name> <age>${personalForm.Q2.answer}</age> <dateOfBirth>${personalForm.Q3.answer.asString}</dateOfBirth> <communicationMethod>${personalForm.Q4.answer.value}</communicationMethod> <creditCardTypes> <% for (selectedOption in personalForm.Q5.answers) { %> <type>${selectedOption.value}</type> <% } %> </creditCardTypes> </contactInformation>

Generert tekst

<contactInformation> <name>Dan Druff</name> <age>29</age> <dateOfBirth>1992-01-01</dateOfBirth> <communicationMethod>1</communicationMethod> <creditCardTypes> <type>1</type> </creditCardTypes> </contactInformation>

Da skriptet ble skrevet, var det klart at Q1 og Q2 er innputt-spørsmål, Q3 er også et innputt-spørsmål, men med dato-validering, Q4 er et spørsmål med enkelt-valg og Q5 er et flervalgsspørsmål.

Det neste eksempelet bruker en skjema-variabel, signUpForm, og går gjennom alle standard spørsmål og skriver ut svarene (og med standard spørsmål menes alle spørsmål som ikke er inne i spørsmålsgrupper i datamodellen).

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <form> <%for (aQuestion in signUpForm.questionAnswers.values()) {     if (aQuestion instanceof ValueInputQuestion) {%>         <question id="${aQuestion.question.id}" text="${aQuestion.question.label.text.xml}">${(aQuestion.answer instanceof DateObj) ? aQuestion.answer.asString : aQuestion.answer}</question>     <%} else if (aQuestion instanceof SingleSelectQuestion) {%>         <question id="${aQuestion.question.id}" text="${aQuestion.question.label.text.xml}">${aQuestion.answer.value}</question>     <%} else if (aQuestion instanceof MultiSelectQuestion) {%>         <question id="${aQuestion.question.id}" text="${aQuestion.question.label.text.xml}">${aQuestion.answers.value}</question>     <%}  }%> </form>

Legg merke til at spørsmål med filer som svar ikke skrives ut i eksempelet. Det vil fungere på alle skjema, men vil ikke skrive ut svar fra spørsmål inne i spørsmålsgrupper i datamodellen. Det neste spørsmålet derimot skriver også ut innhold fra spørsmålsgrupper, samt at fil-svar også tas hensyn til.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <form> <%for (questionGroupList in signUpForm.questionGroupAnswers.values()) {     for (aQuestionGroup in questionGroupList) {%>         <questionGroup id="${aQuestionGroup.groupId}">             <%for (aQuestion in aQuestionGroup.questionAnswerList) {                 if (aQuestion instanceof ValueInputQuestion) {%>                     <question id="${aQuestion.question.id}" text="${aQuestion.question.label.text.xml}">${(aQuestion.answer instanceof DateObj) ? aQuestion.answer.asString : aQuestion.answer}</question>                 <%} else if (aQuestion instanceof SingleSelectQuestion) {%>                     <question id="${aQuestion.question.id}" text="${aQuestion.question.label.text.xml}">${aQuestion.answer?.value}</question>                 <%} else if (aQuestion instanceof MultiSelectQuestion) {%>                     <question id="${aQuestion.question.id}" text="${aQuestion.question.label.text.xml}">${aQuestion.answers.value}</question>                 <%} else if (aQuestion instanceof FileQuestion) {%>                     <question id="${aQuestion.question.id}" text="${aQuestion.question.label.text.xml}">${aQuestion.answer?.fileName}</question>                 <%}             }%>         </questionGroup>     <%   } }%> </form>

Koden går gjennom alle spørsmålsgrupper rekursivt og skriver ut svarene. Skriptet fungerer for alle skjema.

Som nevnt tidligere vil kode inne i ${}-klammer påvirke den genererte teksten. Her er et eksempel på hvordan du kan splitte opp et dato-objekt, og også formatere svaret til egen preferanse:

Tekstgenerator-skript

<contactInformation> <name>${name}</name> <age>${age}</age> <dateOfBirth> <year>${dateOfBirth.year}</year> <month>${dateOfBirth.month}</month> <day>${dateOfBirth.day}</day> <text>${dateOfBirth.asString}</text> <formatted>${dateOfBirth.format('DD-MM-YYYY')}</formatted> </dateOfBirth> </contactInformation>

Generert tekst

<contactInformation> <name>Dinah Mite</name> <age>39</age> <dateOfBirth> <year>1982</year> <month>5</month> <day>13</day> <text>1982-05-13</text> <formatted>13-05-1982</formatted> </dateOfBirth> </contactInformation>

 

I dette tilfellet er alle inn-variabler knyttet til innputt-spørsmål. Variabelen name har Tekststreng-validering, age har heltall-validering og dateOfBirth har dato-validering.

Selv om alle eksemplene er XML-skript gjelder de samme prinsippene og Groovy-koden for JSON-filer og filer med andre format.