Professionelles Database Publishing
Datenstrukturierung und -zugriff
Da die Datenquelle beliebig strukturiert sein kann, gibt es verschiedene Befehle, um aus dem Layoutregelwerk auf die Daten zuzugreifen. Wenn der speedata Publisher startet, sucht er nach einem Einsprungspunkt für das Wurzelelement in den Daten. In dem »Hello world«-Beispiel war das das Element mit dem Namen data
. Das Gegenstück in dem Regelwerk lautet
<Record element="data">
Sobald der Publisher auf ein Element in den Daten trifft, sucht er im Layoutregelwerk den Befehl Record
mit dem Attribut element
, dessen Inhalt der Name des Elements aus den Daten ist. Hat das Programm einen passenden Befehl Record
gefunden, werden alle Befehle innerhalb des Elements ausgeführt.
Patrick Gundlach
Zusammenhang zwischen Elementen in der Datendatei und der Verarbeitung im Layout-Regelwerk
In dem Beispiel ist das nur der Befehl PlaceObject
, um ein Objekt zu platzieren. Innerhalb eines Record
-Befehls kann mit ProcessNode
auf Kindelemente in den Daten zugegriffen werden. Wenn beispielsweise folgende Daten-XML vorliegen,
<configuration> <os arch="i386, amd64">Linux</os> <os arch="amd64">Mac OS X</os> <os arch="i386, amd64">Windows</os> </configuration>
kann im Layout auf die Inhalte wie folgt zugegriffen werden:
<Layout xmlns="urn:speedata.de:2009/publisher/en"> <Options mainlanguage="German"/> <Record element="configuration"> <PlaceObject> <Textblock> <Paragraph> <B> <Value>Unterstützte Plattformen</Value> </B> </Paragraph> </Textblock> </PlaceObject> <!-- Ruft für jedes Kindelement den passenden <Record> auf --> <ProcessNode select="os"/> </Record> <!-- wird durch <ProcessNode ... /> aufgerufen --> <Record element="os"> <PlaceObject> <Textblock> <Paragraph> <Value select="string(.)"/> <I> <Value> (</Value> <Value select="@arch"/> <Value>)</Value> </I> </Paragraph> </Textblock> </PlaceObject> </Record> </Layout>
Der Befehl ProcessNode
ruft den passenden Record
für jedes Kindelement mit diesem Namen auf. Beim Ausführen des Befehls Record element="os"
befindet sich der Publisher im Element os
und man kann mit @...
auf Attribute und mit .
auf den Inhalt des Elements zugreifen.
Alternativ und kürzer kann mithilfe des Befehls ForAll
auf Kinddaten zugegriffen werden (dieselben Daten, hier nur die Layoutdatei):
<Layout xmlns="urn:speedata.de:2009/publisher/en"> <Options mainlanguage="German"/> <Record element="configuration"> <PlaceObject> <Table padding="2pt" columndistance="4pt"> <Tr> <Td> <Paragraph> <Value>Betriebssytem</Value> </Paragraph> </Td> <Td> <Paragraph> <Value>Architektur</Value> </Paragraph> </Td> </Tr> <Tablerule/> <ForAll select="os"> <Tr> <Td> <Paragraph> <Value select="string(.)"/> </Paragraph> </Td> <Td> <Paragraph> <Value select="@arch"/> </Paragraph> </Td> </Tr> </ForAll> </Table> </PlaceObject> </Record> </Layout>
Hier wird für jeden Eintrag os
eine Tabellenzeile erzeugt. Der Fokus (also der aktuelle Knoten im Daten-XML) ist nun abwechselnd in jedem der Kindelemente, damit kann wie oben auf deren Inhalte zugegriffen werden.