Eine Anfrage eines Kunden hatte mich vor einiger Zeit auf das Thema XSLT (
XSL Transformation) gebracht.
Ziel war es Daten in einer Excel-Datei zu pflegen, diese als XML-Datei zu exportieren und diese dann in ein XFA-Formular zu importieren.
XSLT war hier zwingend erforderlich, da Excel nur sehr flache XML-Strukturen unterstützt, die nicht zum Aufbau des XFA-Formulars passen wollten.
Generell bietet sich XSLT immer an wenn importierte/exportierte Daten umstrukturiert werden sollen.
XSLT erlaubt vielfältige Manipulationen, wie z.B. Attribute und Elemente hinzufügen, entfernen oder umbenennen.
Dieses Beispiel soll einmal die Möglichkeiten zeigen, die XSLT bei Verwendung einer Datenbindung mitbringt.
A while ago a customers request brought me to the topic XSLT in XFA forms.
The goal was to fill data in a Excel file, export those data as XML file and import it into a XFA form.
XSLT became neccessary because Excel only allows very plain XML structures that didn't fit the structure of the XFA form.
XSLT is always the first choice if you need to restructure the imported/exported data.
It allows a variety of manipulations as adding, removing or renaming attributes and elements.
In this example I would like to show what you can do with XSLT in a data connection.
1. Als Ausgang dient wieder eine Excel-Datei, in der man Kundendaten pflegt und dann als XML-Datei exportiert.
//
We're starting with an Excel file where we fill some customer data and export those as a XML file.
|
Excel-Datei mit XML-Zuordnung
//
Excel file with XML mapping |
<!-- XML-Struktur aus Excel // XML structure from Excel -->
<CustomerList>
<Customer Firstname="String" Middlename="String" Lastname="String" Sex="String" Birthday="YYYY-MM-DD"/>
<Info Address="String" ZIP="String" City="String"/>
</Customer>
...
</CustomerList>
2. Das XFA-Formular, in das die Daten dann importiert werden sollen, hat in diesem Fall eine Datenbindung an ein Schema (XSD), das eine andere Struktur als die XML-Datei aufweist.
//
The XFA form has a data connection to a schema (XSD) with a different structure than the XML file we're going to import.
<!-- XML-Struktur in XFA-Formular // XML structure in XFA form -->
<MyCustomers>
<Customer>
<General>
<FirstName>String</FirstName>
<MiddleName>String</MiddleName>
<LastName>String</LastName>
<Gender>String</Gender>
<BirthDay>YYYY-MM-DD</BirthDay>
</General>
<Address>
<Street>String</Street>
<ZipCode>String</ZipCode>
<Town>String</Town>
</Address>
<Contact>
<Phone>String</Phone>
<Mobile>String</Mobile>
<Email>String</Email>
</Contact>
</Customer>
...
</MyCustomers>
3. Damit die eingehenden (importierten) Daten dennoch korrekt zugewiesen werden, wird der Datenverbindung auch ein XSLT-Stylesheet zugewiesen, das die erforderliche Transformierung vornimmt.
Auch die ausgehenden (exportierten) Daten werden umgewandelt, sodass die XML-Datei ebenso eine andere Struktur aufweist.
//
To allow an correct assigment of the incomming (imported) data the data connection additionally uses a XSLT stylesheet to transform the data.
Also the outgoing (exported) data is transformed, so an exported XML file has a different structure too.
|
Datenverbindung mit XSLT
//
Data Connection with XSLT |
<!-- XSLT-Stylesheet -->
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="CustomerList">
<MyCustomers>
<xsl:comment>NOTE: XML data was transformed by XSLT during import to conform the embedded XML schema</xsl:comment>
<xsl:variable name="Customer" select="Customer"/>
<xsl:for-each select="$Customer">
<xsl:variable name="Info" select="./Info"/>
<Customer>
<General>
<FirstName>
<xsl:value-of select="@Firstname"/>
</FirstName>
<MiddleName>
<xsl:value-of select="@Middlename"/>
</MiddleName>
<LastName>
<xsl:value-of select="@Lastname"/>
</LastName>
<Gender>
<xsl:value-of select="@Sex"/>
</Gender>
<BirthDay>
<xsl:value-of select="@Birthday"/>
</BirthDay>
</General>
<Address>
<Street>
<xsl:value-of select="$Info/@Address"/>
</Street>
<ZipCode>
<xsl:value-of select="$Info/@ZIP"/>
</ZipCode>
<Town>
<xsl:value-of select="$Info/@City"/>
</Town>
</Address>
</Customer>
</xsl:for-each>
</MyCustomers>
</xsl:template>
</xsl:stylesheet>
Beispiel-Dateien
//
Sample files
https://files.acrobat.com/a/preview/509c0f0c-1a3c-4ce5-8f0e-0378f391ef0a