Handbuch durchsuchen:

- Startseite
- Einleitung
- Hallo Welt!
- Grundlagen
  - Erstellen eines Layoutregelwerks
  - Aufbau der Datendatei und des Layoutregelwerks
  - Objekte ausgeben
  - Raster
  - Bereiche auf der Seite (PositioningArea)
  - Dateiorganisation
  - Silbentrennung / Spracheinstellungen
  - Einbinden von Schriftarten
  - Textformate
  - Textformatierung
  - Farben
- Programmierung
- Bilder einbinden
- Tabellen
- Fortgeschrittene Themen
  - Lesezeichen (Bookmarks)
  - Erzeugen von XML-Strukturen
  - Druckausgabe / Schnittmarken
  - CSS
  - Gruppen (virtuelle Objekte)
  - Virtuelle Seiten
  - Rotieren von Inhalten
  - Sortieren von Daten
  - Umfließen von Bildern
  - Seitentypen
  - Starten des Publishers über den Hotfolder
  - Lua-Filter / Datenvorverarbeitung
  - Schemavalidierung
  - Qualitätssicherung (PDF-Vergleich)
  - Fehlersuche / Debugging
  - Servermodus
  - Steuerung des Layouts beim Aufruf des Publishers
- Kochbuch
  - Daumenregister
  - Mehrseitige PDF-Dateien einbinden
  - Layoutoptimierung mithilfe von Gruppen
  - Aufzählungslisten nachahmen
  - Verzeichnisse erstellen
  - Inhaltsverzeichnis in einem Durchlauf erstellen
  - Seitenzahlen: Seite x von y
- Installationsanleitung
- Dateinamen im Publisher
- Voreinstellungen im speedata Publisher
- Starten des Publishers über die Kommandozeile
- Konfiguration des Publishers
- Längenangaben und Maßeinheiten
- XPath- und Layoutfunktionen
- Interne Variablen
- XML Editor mit Schema verbinden
  - Visual Studio Code
  - OxygenXML
  - Atom
- Liste der Änderungen
- Glossar
- Befehlsreferenz
  - A
  - Action
  - AddSearchpath
  - AtPageCreation
  - AtPageShipout
  - AttachFile
  - Attribute
  - B
  - Barcode
  - Bold
  - BoldItalic
  - Bookmark
  - Box
  - Br
  - Case
  - Circle
  - Color
  - Column
  - Columns
  - Compatibility
  - Contents
  - Copy-of
  - DefineColor
  - DefineColorprofile
  - DefineFontalias
  - DefineFontfamily
  - DefineTextformat
  - Element
  - Fallback
  - Fontface
  - ForAll
  - Frame
  - Grid
  - Group
  - Groupcontents
  - HSpace
  - Hyphenation
  - I
  - Image
  - Include
  - Initial
  - InsertPages
  - Italic
  - Layout
  - Li
  - LoadDataset
  - LoadFontfile
  - Loop
  - Makeindex
  - Margin
  - Mark
  - Message
  - NewPage
  - NextFrame
  - NextRow
  - NoBreak
  - Ol
  - Options
  - Otherwise
  - Output
  - Overlay
  - Pageformat
  - Pagetype
  - Paragraph
  - PDFOptions
  - PlaceObject
  - Position
  - PositioningArea
  - PositioningFrame
  - ProcessNode
  - Record
  - Regular
  - Rule
  - SaveDataset
  - SavePages
  - SetGrid
  - SetVariable
  - SortSequence
  - Stylesheet
  - Span
  - Sub
  - Sup
  - Switch
  - Table
  - TableNewPage
  - Tablefoot
  - Tablehead
  - Tablerule
  - Td
  - Text
  - Textblock
  - Tr
  - Trace
  - Transformation
  - U
  - Ul
  - Until
  - URL
  - Value
  - VSpace
  - While

Version 4.2.0
Handbuch durchsuchen

- Startseite
- Einleitung
- Hallo Welt!
- Grundlagen
  - Erstellen eines Layoutregelwerks
  - Aufbau der Datendatei und des Layoutregelwerks
  - Objekte ausgeben
  - Raster
  - Bereiche auf der Seite (PositioningArea)
  - Dateiorganisation
  - Silbentrennung / Spracheinstellungen
  - Einbinden von Schriftarten
  - Textformate
  - Textformatierung
  - Farben
- Programmierung
- Bilder einbinden
- Tabellen
- Fortgeschrittene Themen
  - Lesezeichen (Bookmarks)
  - Erzeugen von XML-Strukturen
  - Druckausgabe / Schnittmarken
  - CSS
  - Gruppen (virtuelle Objekte)
  - Virtuelle Seiten
  - Rotieren von Inhalten
  - Sortieren von Daten
  - Umfließen von Bildern
  - Seitentypen
  - Starten des Publishers über den Hotfolder
  - Lua-Filter / Datenvorverarbeitung
  - Schemavalidierung
  - Qualitätssicherung (PDF-Vergleich)
  - Fehlersuche / Debugging
  - Servermodus
  - Steuerung des Layouts beim Aufruf des Publishers
- Kochbuch
  - Daumenregister
  - Mehrseitige PDF-Dateien einbinden
  - Layoutoptimierung mithilfe von Gruppen
  - Aufzählungslisten nachahmen
  - Verzeichnisse erstellen
  - Inhaltsverzeichnis in einem Durchlauf erstellen
  - Seitenzahlen: Seite x von y
- Installationsanleitung
- Dateinamen im Publisher
- Voreinstellungen im speedata Publisher
- Starten des Publishers über die Kommandozeile
- Konfiguration des Publishers
- Längenangaben und Maßeinheiten
- XPath- und Layoutfunktionen
- Interne Variablen
- XML Editor mit Schema verbinden
  - Visual Studio Code
  - OxygenXML
  - Atom
- Liste der Änderungen
- Glossar
- Befehlsreferenz
  - A
  - Action
  - AddSearchpath
  - AtPageCreation
  - AtPageShipout
  - AttachFile
  - Attribute
  - B
  - Barcode
  - Bold
  - BoldItalic
  - Bookmark
  - Box
  - Br
  - Case
  - Circle
  - Color
  - Column
  - Columns
  - Compatibility
  - Contents
  - Copy-of
  - DefineColor
  - DefineColorprofile
  - DefineFontalias
  - DefineFontfamily
  - DefineTextformat
  - Element
  - Fallback
  - Fontface
  - ForAll
  - Frame
  - Grid
  - Group
  - Groupcontents
  - HSpace
  - Hyphenation
  - I
  - Image
  - Include
  - Initial
  - InsertPages
  - Italic
  - Layout
  - Li
  - LoadDataset
  - LoadFontfile
  - Loop
  - Makeindex
  - Margin
  - Mark
  - Message
  - NewPage
  - NextFrame
  - NextRow
  - NoBreak
  - Ol
  - Options
  - Otherwise
  - Output
  - Overlay
  - Pageformat
  - Pagetype
  - Paragraph
  - PDFOptions
  - PlaceObject
  - Position
  - PositioningArea
  - PositioningFrame
  - ProcessNode
  - Record
  - Regular
  - Rule
  - SaveDataset
  - SavePages
  - SetGrid
  - SetVariable
  - SortSequence
  - Stylesheet
  - Span
  - Sub
  - Sup
  - Switch
  - Table
  - TableNewPage
  - Tablefoot
  - Tablehead
  - Tablerule
  - Td
  - Text
  - Textblock
  - Tr
  - Trace
  - Transformation
  - U
  - Ul
  - Until
  - URL
  - Value
  - VSpace
  - While

- This manual in English

# XPath- und Layoutfunktionen

## XPath Ausdrücke

Der Publisher akzeptiert in den den entsprechend markierten Attributen (zumeist `select` und `test`) XPath Ausdrücke. In allen anderen Attributen kann durch die geschweiften Klammern (`{` und `}`) ein XPath Ausdruck erzwungen werden. Siehe z.B. das Layout im examples-Repository für Optimierung mit Gruppen. In diesem Beispiel werden im Attribut `width` und im Element `Value` die Werte dynamisch erzeugt, d. h. für die Angabe der Breite wird auf den Inhalt der Variablen `breite` zurückgegriffen, der Inhalt des Absatzes ist der Inhalt (Textwert) des gerade aktuellen Datenknotens.

    <Textblock width="{$breite}">
      <Paragraph>
        <Value select="."/>
      </Paragraph>
    </Textblock>

## Folgende XPath-Ausdrücke erkennt das System:

- Zahl: gibt den Wert direkt zurück. Beispiel: `"5"`
- Text: gibt den Wert direkt zurück. Beispiel: `'Text'`
- Rechenoperationen (`*`, `div`, `idiv`, `+`, `-`, `mod`). Beispiel: `( 6 + 4.5 ) * 2`
- Zugriff auf Variablen. Beispiel: `$spalte + 2`
- Zugriff auf den aktuellen Knoten (Punkt-Operator). Beispiel: `. + 2`
- Zugriff auf Unterelemente. Beispiel: `produktdaten`, `node()`, `*`, `foo/bar`
- Zugriff auf Attribute im aktuellen Knoten. Beispiel `@a`
- Zugriff auf Attribute in Kindelementen, zum Beispiel `foo/@bar`.
- Boolesche Ausdrücke: `<`, `>`, `<=`, `>=`, `=`, `!=`. Vorsicht: das Zeichen `<` muss in XML als `&lt;` geschrieben werden, das Zeichen `>` kann als `&gt;` geschrieben werden. Beispiel: `$zahl > 6`. Kann in Bedingungen benutzt werden.
- Einfache `if/then/else`-Abfragen: `if (…​) then …​ else …​`

## Layout-Funktionen

Es gibt zwei Klassen von Funktionen: standardkonforme (XPath-) und speedata Publisher Layout-Funktionen. Die Layout-Funktionen sind im Namensraum `urn:speedata:2009/publisher/functions/de` (im Folgenden mit `sd:` gekennzeichnet) definiert. Optionale Parameter werden durch eckige Klammern markiert. Beispiel: die Funktion `sd:current-row()` kann auch mit Parameter `sd:current-row('name')` aufgerufen werden. Die Auslassungspunkte `…​` bedeuten, dass der letzte Wert beliebig oft wiederholt werden kann.

`sd:allocated(x,y,<Bereichsname>,<Rahmennummer>)`

  Gibt wahr zurück, wenn die Zelle belegt ist (seit 2.3.71).

`sd:alternating(<typ>, <text>[,<text>,…​])`

  Bei jedem Aufruf wird das nächste Argument zurück gegeben. Wert des Typs ist beliebig, muss aber eindeutig sein. Beispiel: `sd:alternating("tbl", "Weiß","Grau")` könnte für die Hintergrundfarbe von Tabellen benutzt werden. Beispiel siehe Abwechselnde Zeilenfarben.

`sd:aspectratio(<Bildname>)`

  Gibt das Ergebnis der Division Bildbreite / Bildhöhe zurück. (D. h. < 1 für Hochkantbilder, > 1 für Querformat.)

`sd:attr(<Name>[, …​])`

  ist dasselbe wie `@Name`, nur mit der Möglichkeit den Namen auch dynamisch (z. B. mit `concat()`) zu erzeugen. Siehe Beispiel bei `sd:variable()`.

`sd:count-saved-pages(<Name>)`

  Gibt die Anzahl der gespeicherten Seiten, die mit `<SavePages>` zwischengespeichert wurden.

`sd:current-column([<area>])`

  Gibt die aktuelle Spalte zurück. Wenn `area` angegeben, gibt die Spalte des gegebenen Platzierungsbereichs zurück.

`sd:current-framenumber(<area>)`

  Gibt die Nummer des aktuellen Rahmens im Platzierungsbereich zurück.

`sd:current-page()`

  Gibt die Seitennummer zurück.

`sd:current-row([<area>])`

  Gibt die aktuelle Zeile zurück. Wenn `area` angegeben, gibt die Zeile des gegebenen Platzierungsbereichs zurück.

`sd:decode-base64(<Zeichenkette>)`

  Konvertiert eine Base64-kodierte Zeichenkette und gibt den binären Inhalt zurück.

`sd:decode-html(<Node>)`

  Wandelt Texte wie `&lt;i&gt;Kursiv&lt;/i&gt;` in entsprechendes HTML-Markup.

`sd:dimexpr(<string>)`

  Werte die Zeichnkette aus. Hilfreich, wenn man zwei Längen addieren oder multiplizieren möchte. Beispiel: "2mm + 5cm".

`sd:dummytext([<Anzahl>])`

  Gibt den Blindtext "Lorem ipsum…​" mit über 50 Wörtern zurück. Mit dem optionalen Parameter kann man festlegen, wie oft der Text wiederholt wird.

`sd:even(<zahl>)`

  Die Rückgabe ist `true()`, wenn die angegebene Zahl gerade ist. Beispiel: `sd:even(sd:current-page())`

`sd:file-exists(<Dateiname oder URI-Schema>)`

  Die Rückgabe ist `true()`, wenn der Dateiname im Suchpfad existiert, ansonsten `false()`.

`sd:filecontents(<binarycontent>)`

  Speichert den Inhalt in eine temporäre Datei und gibt den Namen zurück.

`sd:firstmark(<pagenumber>)`

  Der erste Marker der angegebenen Seitenzahl. Hilfreich z.B. in Wörterbüchern, wo der erste und der letzte Begriff einer Seite ausgegeben werden.

`sd:first-free-row(<name>)`

  Gib die erste freie Zeile des Bereichs zurück (experimentell).

`sd:format-number(<Zahl oder String>, <Tausenderzeichen>, <Kommazeichen>)`

  Formatiert die übergebene Zahl und fügt Tausender-Trennzeichen hinzu und ändert den Kommatrenner. Beispiel: `sd:format-number(12345.67, '.',',')` ergibt die Zeichenkette `12.345,67`.

`sd:format-string(<Objekt>,<Objekt>,…​,<Formatierungsangaben>)`

  Gibt eine Zeichenkette zurück, die die gegebenen Objekte mit den im zweiten Argument gegebenen Formatierungsanweisungen darstellt. Die Formatierungsanweisungen entsprechen der aus der Programmiersprache C bekannten `printf()`-Funktion.

`sd:group-height(<string>[,<string>])`

  Gibt die Höhe in Rasterzellen für die Gruppe im ersten Argument an. Beispiel: `sd:group-height('Beispielgruppe')`. Ist ein zweites Argument angegeben, so wird die Gruppenhöhe als Vielfaches der Einheit genommen. Beispiel: `sd:group-height('Beispielgruppe','mm')` gibt die genaue Höhe der Gruppe in mm an.

`sd:group-width(<string>[,<string>])`

  Gibt die Breite in Rasterzellen für die Gruppe im ersten Argument an. Beispiel: `sd:group-width('Beispielgruppe')`. Für das zweite Argument siehe die Beschreibung von `sd:group-height()` oben.

`sd:imageheight(<Dateiname oder URI-Schema>[,<string>])`

  Höhe des Bildes in Rasterzellen. Vorsicht: sollte das Bild nicht gefunden werden, wird die Höhe des Platzhalters für nicht gefundene Bilder zurückgegeben. Daher muss vorher überprüft werden, ob das Bild existiert. Das zweite Argument ist eine Einheit. Wenn angegeben, ist die Bildbreite ein Vielfaches dieser Einheit.

`sd:imagewidth(<Dateiname oder URI-Schema>[,<string>])`

  Breite des Bildes in Rasterzellen. Vorsicht: sollte das Bild nicht gefunden werden, wird die Breite des Platzhalters für nicht gefundene Bilder zurückgegeben. Daher muss vorher überprüft werden, ob das Bild existiert. Das zweite Argument ist eine Einheit. Wenn angegeben, ist die Bildbreite ein Vielfaches dieser Einheit.

`sd:keep-alternating(<typ>)`

  Benutzt den aktuellen Wert von `sd:alternating(<typ>)`, ohne diesen zu verändern.

`sd:lastmark(<pagenumber>)`

  Der letzte Marker der angegebenen Seitenzahl. Hilfreich z.B. in Wörterbüchern, wo der erste und der letzte Begriff einer Seite ausgegeben werden.

`sd:loremipsum()`

  Alias für `sd:dummytext()`

`sd:merge-pagenumbers(<Seitenzahlen>,[<Trenner für Bereiche>],[<Trenner für Leerraum>])`

  Fasst Seitenzahlenbereiche zusammen. Beispielsweise aus `"1, 3, 4, 5"` wird `1, 3–5`. Voreinstellung für den Trenner für Bereiche ist ein Halbgeviertstrich (–), Voreinstellung für den Trenner für Leerraum ist ', ' (Komma, Leerzeichen). Diese Funktion sortiert die Zahlen und löscht doppelte Einträge. Bei leerem Trenner für Bereiche werden Zahlen nicht zusammengeführt, sondern einzeln mit dem Trenner für Leerraum verbunden.

`sd:mode(<string>[,<string>…​])`

  Gibt Wahr (`true()`) zurück, wenn einer der angegebenen Modi gesetzt ist. Ein Modus kann über die Kommandozeile oder über die Konfigurationsdatei gesetzt werden. Siehe Steuerung des Layouts beim Aufruf des Publishers.

`sd:number-of-columns([<area>])`

  Gibt die Anzahl der Spalten auf der Seite bzw. im angegebenen Bereich.

`sd:number-of-pages(<Dateiname oder URI-Schema>)`

  Ermittelt die Anzahl der Seiten der angegebenen (PDF-)Datei. Siehe das Beispiel in Mehrseitige PDF-Dateien einbinden.

`sd:number-of-rows([<area>])`

  Gibt die Anzahl der Zeilen auf der Seite bzw. im angegebenen Bereich.

`sd:odd(<zahl>)`

  Die Rückgabe ist `true()`,, wenn die angegebene Zahl ungerade ist.

`sd:pagenumber(<Marke>)`

  Liefert die Seitenzahl der Seite auf der die angegebene Marke ausgegeben wurde. Siehe den Befehl Mark und den Abschnitt über Verzeichnisse erstellen.

`sd:randomitem(<Wert>[,<Wert>,…​])`

  Gibt einen der Werte zurück.

`sd:reset-alternating(<typ>)`

  Setzt den Zustand für `sd:alternating()` für den angegebenen Typ zurück.

`sd:sha1(<Wert>[,<Wert>, …​])`

  Erzeugt die SHA-1 Summe der Hintereinanderkettung der Werte als Hex-Zeichenkette. Beispiel: `sd:sha1('Hallo ', 'Welt')` ergibt die Zeichenkette `28cbbc72d6a52617a7abbfff6756d04bbad0106a`.

`sd:variable-exists(<Name>)`

  Prüft, ob eine Variable definiert wurde.

`sd:variable(<Name>[, …​])`

  ist dasselbe wie `$Name`, nur mit der Möglichkeit den Namen auch dynamisch zu erzeugen. Falls `$i` den Wert 3 enthält, liest `sd:variable('foo',$i)` den Inhalt der Variablen `$foo3`. Damit lassen sich Arrays abbilden.

## XPath-Funktionen

`abs(<Zahl>)`

  Liefert den positiven Wert der angegebenen Zahl zurück. Beispiel: sowohl `abs(-1.34)` als auch `abs(-1.34)` ergeben die Zahl `1.34`.

`ceiling(<Zahl>)`

  Ergibt die nächst höhere Ganzzahl zurück. `ceiling(-1.34)` ergibt 1, `ceiling(1.34)` ergibt 2.

`concat(<Wert>,<Wert>, …​)`

  Erzeugt einen neuen Text aus der Verkettung der einzelnen Werte.

`contains(<heuhaufen>,<nadel>)`

  Wahr, wenn `heuhaufen` `nadel` enthält. Beispiel: `contains('bana','na')` ergibt `true()`.

`count()`

  Zählt alle Kindelemente mit dem angegebenen Namen. Beispiel: `count(eintrag)` zählt, wie viele Kindelemente mit den Namen `eintrag` existieren.

`empty(<Attribut>)`

  Prüft, ob ein Attribut (nicht) vorhanden ist. `empty(@doesnotexist)` ergibt `true()`, `empty(@empty)` ergibt `true()` und `empty(@nonempty)` ergibt `false()`.

`false()`

  Gibt „Falsch“ zurück.

`floor()`

  Gibt den nächst niedrigeren Wert als Ganzzahl zurück.

`last()`

  Gibt die Anzahl der Datensätze der gleichnamigen Geschwister-Elemente zurück.

`local-name()`

  Liefert den Namen des aktuellen Knotens zurück (ohne Namensraum).

`lower-case(<text>)`

  Gibt den Text als Kleinbuchstaben zurück. `lower-case('Text')` ergibt `text`.

`max(<Zahl>[, <Zahl>, …​])`

  Liefert das Maximum der Werte zurück: `max(1.1,2.2,3.3,4.4)` ergibt `4.4`.

`min(<Zahl>[, <Zahl>, …​])`

  Liefert das Minimum der Werte zurück: `min(1.1,2.2,3.3,4.4)` ergibt `1.1`.

`normalize-space(<text>)`

  Gibt den Text ohne führende und nachstehende Leerzeichen zurück. Alle Zeilenvorschübe werden durch Leerzeichen ersetzt. Mehrfach hintereinander auftretende Leerzeichen/Zeilenvorschübe werden durch ein einzelnes Leerzeichen ersetzt.

`not()`

  Negiert den Wahrheitswert des Arguments. Beispiel: `not(true())` ergibt `false()`.

`position()`

  Ermittelt die Position des aktuellen Datensatzes. Anwendungsfall: `<Switch><Case test="position() = last()"> …​` führt den Inhalt des `<Case>`-Abschnittes nur beim letzten Element aus.

`replace(<Eingabe>,<Regexp>, <Ersetzung>)`

  Ersetzt die Eingabe mit dem regulären Ausdruck durch den Ersetzungstext. Beispiel: `replace("banana", "a", "o")` ergibt `bonono`. Beispiel mit Ersetzungen: `replace('W151TBH','^[A-Z]([0-9]\+)[A-Z]+$', '$1')` ergibt 151.

`string(<Sequenz>)`

  Gibt den Textwert der Sequenz zurück, d. h. den Inhalt der Elemente.

`string-join(<Sequenz>, Separator)`

  Gibt den Textwert der Sequenz zurück, wobei alle Elemente durch den Separator getrennt werden.

`string-length(<string>)`

  Gibt die Länge der Zeichenkette zurück. Multibyte UTF-8 Sequenzen werden als eine Position gezählt.

`substring(<input>,<start>[,<length>])`

  Gibt einen Teil der Zeichenkette aus `input` zurück, die bei `start` anfängt und (optional) die Länge `length` hat. `substring('Goldfarb', 5, 3)` gibt `far` zurück. `start` kann auch (entgegen der XPath-Spezifikation) auch negativ sein, dann wird vom Ende der Eingabe gezählt.

`tokenize(<Eingabe>,<Regexp>)`

  Die Rückgabe ist eine Sequenz von Zeichenketten. Die Eingabe wird von links nach rechts gelesen. Sobald eine Stelle gefunden wird, auf die der Reguläre Ausdruck passt, wird die bisherige Eingabe zurück gegeben. Beispiel (aus M. Kays XPath / XSLT-Buch): `tokenize("Go home, Jack!", "\W+")` ergibt die Sequenz `"Go", "home", "Jack", ""`.

`true()`

  Gibt „Wahr“ zurück.

`upper-case()`

  Wandelt den Text in Großbuchstaben: `upper-case('Text')` ergibt `TEXT`.

- Längenangaben und Maßeinheiten
- Interne Variablen