Seitenzahlen: Seite x von y
Um die Länge des Dokuments in Seiten anzugeben, ist ein zweiter Durchlauf des Publishers notwendig: Am Ende des ersten Durchlaufs wird die aktuelle (= letzte) Seitennummer gespeichert, die man anschließend in den folgenden Durchläufen nutzen kann.
Das folgende Beispiel erzeugt einige Seiten mit Ausgaben in der Form Seite 1 von ??.
Das dient als Basis für die Ergänzungen.
<Layout xmlns="urn:speedata.de:2009/publisher/en"
xmlns:sd="urn:speedata:2009/publisher/functions/en">
<Record element="data">
<!-- ?? ist zunächst ein Platzhalter, der später überschrieben wird -->
<SetVariable variable="maxseiten" select="'??'"/>
<Loop select="10" variable="i">
<PlaceObject>
<Textblock>
<Paragraph>
<Value
select="concat('Seite ', sd:current-page(), ' von ', $maxseiten )"/>
</Paragraph>
</Textblock>
</PlaceObject>
<SetVariable variable="letzteseite" select="sd:current-page()"/>
<NewPage/>
</Loop>
</Record>
</Layout>Am Ende der letzte Seite kann die Information mithilfe von <SaveDataset> für den nächsten Lauf zwischengespeichert werden:
<SetVariable variable="attSeitenzahl">
<Attribute name="anzahlseiten" select="$letzteseite"/>
</SetVariable>
<SaveDataset
filename="seitenzahl"
elementname="seiteninfo"
attributes="$attSeitenzahl"/><SaveDataset> erwartet eine XML-Struktur bei der
Attribute im Element <Attribute> und, Elemente in <Element> gespeichert werden, wobei dieser Befehl wiederum <Attribute> als Kindelemente haben kann.
Diese Struktur wird als XML auf die Festplatte gespeichert und hat in diesem Beispiel die folgende Form:
<seiteninfo anzahlseiten="10" />Zu Beginn des Laufs kann nun die Datei eingelesen werden, falls sie existiert (d.h. im ersten Lauf wird kein Fehler erzeugt, weil die Datei noch nicht erzeugt wurde):
<Record element="data">
<SetVariable variable="maxseiten" select="'??'"/>
<LoadDataset name="seitenzahl"/>
...und dazu
<Record element="seiteninfo">
<SetVariable variable="maxseiten" select="@anzahlseiten"/>
</Record>Der Datensatz seiteninfo wird dann aufgerufen, wenn die XML-Datei seitenzahl eingelesen wird.
Es wird nichts anderes gemacht, als die kurz vorher definierte Variable maxseiten mit dem korrekten Inhalt zu überschreiben.
Das vollständige Beispiel sieht nun so aus:
<Layout
xmlns="urn:speedata.de:2009/publisher/en"
xmlns:sd="urn:speedata:2009/publisher/functions/en">
<!-- wird erst ausgeführt, wenn die XML-Datei 'seitenzahl'
existiert, d. h. erst ab dem zweiten Durchlauf -->
<Record element="seiteninfo">
<SetVariable variable="maxseiten" select="@anzahlseiten"/>
</Record>
<!-- start der Datenverarbeitung -->
<Record element="data">
<SetVariable variable="maxseiten" select="'??'"/>
<LoadDataset name="seitenzahl"/>
<Loop select="10" variable="i">
<PlaceObject>
<Textblock>
<Paragraph>
<Value
select="concat('Seite ', sd:current-page(), ' von ', $maxseiten )"/>
</Paragraph>
</Textblock>
</PlaceObject>
<SetVariable variable="letzteseite" select="sd:current-page()"/>
<NewPage/>
</Loop>
<!-- Nun steht die Anzahl der Seiten zur Verfügung -->
<SetVariable variable="attSeitenzahl">
<Attribute name="anzahlseiten" select="$letzteseite"/>
</SetVariable>
<SaveDataset
filename="seitenzahl"
elementname="seiteninfo"
attributes="$attSeitenzahl"/>
</Record>
</Layout>