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