Login
Newsletter
Werbung

Do, 3. Juli 2014, 15:00

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.

Zusammenhang zwischen Elementen in der Datendatei und der Verarbeitung im Layout-Regelwerk

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.

Kommentare (Insgesamt: 0 )
Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten
Werbung