Einleitung Was ist XSL-FO?

Transcrição

Einleitung Was ist XSL-FO?
Betrifft:
XSQL Servlet und FOP
Autor:
Dirk Nachbar ([email protected])
Art der Info:
Technische Background Info
Quelle:
Aus unserer Projekt- und Schulungserfahrung
http://xml.apache.org/fop, http://www.xml.com, http://oreilly.com
http://technet.oracle.com, http://metalink.oracle.com
Einleitung
Eines der am weitesten verbreitesten Tools zur Erzeugung von Reports aus Oracle
Datenbanken heraus ist der Reports Designer 6i / 9i. Doch nicht überall steht dieses Tool
zur Verfügung, wie kann man also trotzdem ansprechende Reports im PDF-Format
generieren?
Eine Möglichkeit hierzu bietet das XSQL Servlet in Verbindung mit XSL-FO.
Was ist XSL-FO?
eXentsible Stylesheet Language Formatting Objects (XSL-FO) ist eine
Paginierungsbeschreibungssprache, welche die Darstellung/Wiedergabe eines Dokumentes
im PDF-Format beschreibt.
Der Aufbau eines XSL-FO Dokumentes unterliegt den Regeln, welche in der
nachfolgenden Abbildung dargestellt sind:
Quelle: XML.com ( http://www.xml.com )
Was ist FOP
Formatting Object Processor (FOP) ist ein Druckformatierer, welcher XML-Dokumente
gemäss einem XSL-FO Dokument in ein PDF-Dokument umwandelt. Es können aber auch
andere Formate als PDF verwendet werden, direkte Ausgaben zum Drucker, AWT, PCL
und Textdateien sind möglich.
Um Reports im PDF-Format via XSQL Servlet zu erzeugen, benötigen Sie den Formating
Objects Processor (FOP), welches ein OpenSource Produkt aus dem Apache Project ist
http://xml.apache.org/fop .
Für das nachfolgenden Bespiele wird FOP der Version 0.18_1 verwendet und das
Installationsverzeichnis C:\fop018_1 verwendet. Die Installations- bzw. Buildanleitung für
FOP finden Sie ebenfalls unter http://xml.apache.org/fop .
Quelle: Apache XML Project ( http://xml.apache.org/fop )
XSL-FO in der Praxis
Generell kann man zwei Arten von Anwendungsverfahren in Betracht ziehen, der
Batchbetrieb und der Onlinebetrieb. Für beide Optionen benötigen wir den Formatting
Objects Processor (FOP) aus dem Apache Project. In diesem Artikel betrachten wir den
sog. Onlinebetrieb.
XSL-FO im Onlinebetrieb
Im sogenannten Onlinebetrieb werden die Reports zur Anforderungszeit „on the fly“
erzeugt, so dass immer die derzeit aktuellsten Daten abgerufen werden für den geforderten
Report.
Hierzu benötigen Sie lediglich den bereits durch die Oracle 9i Release 2 Software
mitgelieferten Oracle HTTPServer (OHS) und das XDK (welches auch bereits mit der
Oracle 9i Release 2 Software installiert wird) sowie den FOP aus dem Apache Project der
Version 0.18.1. Die derzeit aktuelle Version 0.20 funktioniert leider nicht in Verbindung
mit dem XSQLServlet .
Installation und Konfiguration
1. FOP
Im Installationsverzeichnis C:\fop018_1 finden Sie die Datei fop.jar und im Verzeichnis
C:\fop018_1\lib die Datei w3c.jar welche für das Transformieren in PDF benötigt werden.
2. XDK / XSQLServlet
Im Verzeichnis $ORACLE_HOME\xdk\admin finden Sie die Konfigurationsdateien
xml.properties, XSQLConfig.xml und xml.conf, welche Sie anpassen müssen.
xml.properties
Die xml.properties müssen Sie um einige wrapper.classpath’s erweitern.
xml.conf
In der xml.conf, welche via include-Option in den OHS von Oracle eingebunden ist,
können Sie zusätzliche Aliase definieren.
In dem hier demonstierten Beispiel verwenden wir die vorgegebenen Aliase.
XSQLConfig.xml
In der Konfigurationsdatei XSQLConfig.xml müssen Sie die „connectiondefs“ bearbeiten
bzw. Eine neue „connection“ hinzufügen, in dem nachfolgenden Beispiel wird die
vorgegebene connection Demo verwendet.
Die Angaben innerhalb des Tags <dburl> müssen entsprechend Ihrer Datenbank
angepasst werden so wie den username und password anpassen:
<dburl>jdbc:oracle:thin:@servername:Listenerport:SID</dburl>
3. OHS / Jserv
In dem Verzeichnis $OH/Apache/Jserv/conf finden Sie die beiden JservKonfigurationsdateien jserv.conf und jserv.properties, welche ebenfalls angepasst werden
müssen.
jserv.conf
In der jserv.conf müssen Sie den ApJServAction für das XSQL Servlet aktivieren in dem Sie
das Auskommentierungszeichen „#“ entfernen, falls dieses nicht bereits schon aktiviert ist.
jserv.properties
In der jserv.properties müssen Sie nachfolgenden wrapper-Einträge aktieren bzw.
hinzufügen.
XSQL-Datei anlegen
Zuerst definieren Sie eine xsql-Datei (emp.xsql) mit der entsprechenden SQL-Abfrage
(hierbei kann direkt auf eine Tabelle zugegriffen werden oder auch auf einen View).
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="emp_fo.xsl"
serializer="FOP"?>
<xsql:query connection="demo" xmlns:xsql="urn:oracle-xsql">
SELECT
EMPNO, ENAME, SAL
FROM
EMP
ORDER BY DEPTNO
</xsql:query>
Die xsql-Datei ist eine XML-Datei, in welcher ein Stylesheet verankert wird. Bei der
Stylesheetverankerung müssen Sie den type mit text/xsl angeben und den serializer mit
FOP.
Anschliessend müssen Sie einen speziellen XSQL-Tag eröffnen (<xsql:query ...>) in dem
Sie die zu verwendende Connection angeben und den Namesspace für das XSQL Servlet
angeben.
Innerhalb des XSQL-Tags <xsql:query ...> </xsql:query> können Sie nun Ihre Abfrage
definieren.
Würde man nun diese xsql-Datei ohne die Stylesheetverankerung aufrufen, erhält man
einen Output im „puren“ XML-Format:
<?xml version="1.0"?>
<!-- actual no Stylesheet
<?xml-stylesheet type="text/xsl" href="emp_fo.xsl"
serializer="FOP"?>
end of Comment off -->
<xsql:query connection="demo" xmlns:xsql="urn:oracle-xsql">
SELECT
EMPNO, ENAME, SAL
FROM
EMP
ORDER BY DEPTNO
</xsql:query>
XSL-FO Datei anlegen
Nun müssen Sie die XSL-FO Datei anlegen:
<?xml version="1.0"?>
<fo:root xmlns:fo=http://www.w3.org/1999/XSL/Format
xsl:version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- definition of master layout -->
<fo:layout-master-set>
<fo:simple-page-master
master-name="first" page-height="29.7cm"
page-width="21cm" margin-top="1.0cm"
margin-bottom="2.0cm" margin-left="2.0cm"
margin-right="2.0cm">
<fo:region-body margin-top="3cm"/>
</fo:simple-page-master>
</fo:layout-master-set>
<!-- starting actual layout -->
<fo:page-sequence master-name="first">
<fo:flow flow-name="xsl-region-body">
<fo:block font-size="20pt" font-family="Arial"
line-height="20pt" space-after.optimum="3pt"
font-weight="bold" start-indent="5pt">
List of all employees including salery and sum of all
Salaries
</fo:block>
<!-- starting the table -->
<fo:block border-width="2pt" border-style=”solid”
background-color=”lightgrey”>
<fo:table>
<fo:table-column column-width="4cm"/>
<fo:table-column column-width="4cm"/>
<fo:table-column column-width="4cm"/>
<fo:table-body font-size="10pt"
font-family="sans-serif">
<xsl:for-each select="ROWSET/ROW">
<fo:table-row line-height="12pt">
<fo:table-cell>
<fo:block>
<xsl:value-of select="EMPNO"/>
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>
<xsl:value-of select="ENAME"/>
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>
<xsl:value-of select="SAL"/>
</fo:block>
</fo:table-cell>
</fo:table-row>
</xsl:for-each>
</fo:table-body>
</fo:table>
</fo:block>
<fo:block font-size="15pt" font-family="Arial"
line-height="15pt" space-after.optimum="3pt"
font-weight="bold" start-indent="5cm">
Sum in US $:
<xsl:value-of select="sum(/ROWSET/ROW/SAL)"/>
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
Speichern Sie diese XSL-FO Datei unter dem Namen emp_fo.xsl.
Kopieren Sie nun die beiden Datei emp.xsql und emp_fo.xsql in das Verzeichnis
$ORACLE_HOME/xdk/demo/java/xsql und rufen Sie mit einem Browser die folgende URL
auf: http://servername:port/xsql/emp.xsql , Sie sollten dann folgenden Darstellung erhalten:
Fazit
Mit XSL-FO wird eine gute Möglichkeit geboten Reports in ansprechenden Layouts zu
erzeugen, doch eine gewisse Einarbeitung in den Entwurf von Stylesheets bleibt nicht
erspart. Doch die derzeit verfügbaren Tools (z.B. XMLSpy, Antenna House XSL Formatter,
usw.) zur Generierung von Stylsheets erleichtern die Arbeit ungemein ☺.
Ein weiterer Vorteil dieser Variante der Reportsgenerierung ist, dass sie keine Lizenzen für
die Internet Developer Suite bnötigen ☺.
Falls Sie noch mehr über XML-Technologien erfahren wollen, dann würde es uns freuen,
Sie in einem unserer Kurse (XML-A oder einen unserer JAVA-Kurse) begrüßen zu dürfen.
Viel Spaß beim Generieren von Reports und viele PDF-Dokumente wünscht
Dirk Nachbar
Trivadis GmbH
Dirk Nachbar
Cityforum im Eichsfeld
Ferdinand-Stuttmann-Str. 13
D-65428 Rüsselsheim
Internet: http://www.trivadis.com
Mail:
[email protected]
Tel:
Fax:
+49 6142 210 18 0
+49 6142 210 18 29