€ 9,80 Österreich € 10,20 Luxemburg € 11,25 Schweiz SFr 19,20 XML magazin & WEB SERVICES Deutschland >> Interview: Cocoon-Erfinder Stefano Mazzocchi 2.02 XML und Datenbanken Native oder Relationale XML-Datenspeicher? Web Services Transaktionen Komplexe Dienste orchestrieren REST oder SOAP? Streit der Web ServicesArchitekturen XSLT 2.0 und XPath 2.0 Neue W3C-Entwürfe im Detail Enterprise Code-Generatoren XSLT Stylesheets und objektorientierte Patterns im Team EDI und XML Technologien und Produkte mit CD! Massenspektren mit SVG <xmlpraxis> Technologie-Mix MSpec::SVG – Generierung von Massenspektren im SVG-Format In diesem Artikel soll eine Anwendung vorgestellt werden, die die Generierung von Massenspektrengrafiken ausgehend von in einer Datenbank abgelegten Informationen ermöglicht, und dabei verschiedene frei verfügbare Standards und Technologien zusammenführt. Der Weg zu SVG wird durch das Zusammenspiel von PHP, MySQL, XML und XSLT geebnet und auch HTML, CSS und JavaScript tragen zu einem echten Technologie-Mix bei. von Thomas Meinike Die genannte Mixtur aus client- und serverseitigen Technologien spiegelt einen Teil des Spektrums der Ausbildung von Technischen Redakteurinnen und Redakteuren an der Fachhochschule Merseburg wider. Dabei sind obligatorische Themen (HTML/CSS, XML/XSLT) und in Form von Wahlpflichtfächern angebotene Inhalte (JavaScript, PHP, MySQL) vertreten. Da die genannten Standards und Technologien einerseits eher selten zusammengeführt werden und es andererseits an anschaulichen Anwendungen mangelt, entstand die Anwendung MSpec::SVG. Die inhaltliche Grundidee stammt aus früheren Aktivitäten des Autors im naturwissenschaftlichen Bereich. Den technischen Hintergrund bildet ein so genannter LAMP-Server (Linux, Apache Webserver, MySQL-Datenbank, PHP) mit XSLTUnterstützung (Apache-Modul mod_xslt bzw. XSLT-Prozessor Sablotron). PHP wird in einer Version ab 4.1 erwartet, alle anderen Komponenten müssen funktionieren, aber nicht unbedingt auf dem jeweils letzten Versionsstand sein. Was sind Massenspektren? Die Massenspektrometrie ist eine Methode der chemischen Analytik. Im Vakuum werden die Proben mittels Elektronenstößen ionisiert und die daraus resultierenden Quellcode Den Quellcode zum Artikel finden Sie auf der beiliegenden CD. 68 Bruchstücke hinsichtlich Massenzahl und relativer Intensität vermessen. Es entstehen typische Linienspektren, die letztlich Rückschlüsse auf die vorhandenen Substanzen ermöglichen. Massenspektren von reinen Stoffen werden in umfangreichen Datensammlungen dokumentiert und auch in Form von Softwarebibliotheken eingesetzt. Ein mehrbändiges Werk wird vom Mass Spectrometry Data Center in Cambridge herausgegeben [1]. Tabelliert werden darin die Massenzahlen und die jeweiligen Intensitäten. Daraus lassen sich relativ leicht grafische Darstellungen erzeugen. XML ist der Weg und das Ziel Als Zielformat bieten sich die in XML formulierten Scalable Vector Graphics (SVG) geradezu an [2-4]. Auf dem Weg dorthin werden in einer MySQL-Datenbank vorliegende Datensätze in einer temporären XML-Struktur gespeichert und mittels XSLT wahlweise in Grafiken oder eine tabellarische Ausgabe (HTML) überführt (siehe Abb. 1). In der mitgelieferten MySQL-Beispieltabelle msdata sind neun Datensätze zu den Verbindungen mit der Summenformel C4H8 (6 Einträge) bzw. C6H5ClO (3 Einträge) enthalten. Die Tabellenstruktur wird durch die Felder id (SMALLINT, AUTO_ INCREMENT), formel (VARCHAR(50)), verbindung (VARCHAR (255)) und daten (TEXT) gebildet. Abbildung 2 (siehe Seite 70) zeigt einen Ausschnitt der Beispieldaten. Die eigentlichen Datensätze sind in der Form Massenzahl_1|Intensität_1|...| Massenzahl_n|Intensität_n eingetragen, was sich bei der späteren Verarbeitung als vorteilhaft erweist. Nachdem man auf der Startseite des Projekts eine Summenformel eingegeben und den Button SUCHEN betätigt hat, wird das PHP-Skript verbind.php aufgerufen, welches mit einer SQL-Abfrage alle zugehörigen Verbindungen ermittelt und in einer Auswahlliste präsentiert (siehe Abb. 3 auf Seite 70): <?php // ... $abfrage=“SELECT verbindung FROM msdata WHERE formel=’$suchtext’“; // ... ?> Nun können eine konkrete Verbindung ausgewählt und über den Button SPEKTRUM der jeweilige Datensatz ermittelt werden. Diese SQL-Abfrage und weitere Aktionen werden durch daten.php gesteuert: <?php // ... $abfrage=“SELECT daten FROM msdata WHERE verbindung=’$verbindung’“; $ergebnis=mysql_query($abfrage,$dbref); $zeile=mysql_fetch_array($ergebnis); $daten=$zeile[“daten“]; $datensatz=explode(“|“,$daten); // ... ?> Die PHP-Funktion explode() trennt die Daten anhand des Trennzeichens | und gibt ein Datenfeld (Array) zurück. Es folgt die Speicherung des aktuellen Datensatzes in Ausgabe 2/02 Massenspektren mit SVG <xmlpraxis> einer temporären XML-Struktur. Der in Listing 1 gezeigte PHP-Code speichert diese in der Datei mspec.xml. Die Struktur dieser XML-Dokumente wird durch die Document Type Definition mspec.dtd vorgegeben (Listing 2). Die Nutzdaten wurden den Elementen mass und intensity zugeordnet, die ihrerseits Kindelemente von data sind. Das Element dataset umschließt die vorhandenen Datensätze und besitzt einige Attribute, die zur späteren Erzeugung der Ausgabedaten benötigt werden. Die Attribute compound- Listing 1 <?php Abb. 1: Prinzip der Verarbeitung in MSpec::SVG. name und sum-formula korrespondieren mit den VARCHAR-Einträgen der Datenbanktabelle, während info Datum und Uhrzeit der Verarbeitung enthält. Zusätzlich sind die Attribute scale und trans vorhanden, mit denen Einfluss auf die SVGDarstellung genommen werden kann. Jedes temporäre XML-Dokument hat also den in Listing 3 gezeigten Aufbau. // ... // XML-Daten erzeugen Weiterverarbeitung mittels XSLT $xmlfile=“mspec.xml“; Die beschriebene XML-Struktur bildet die Grundlage zur Ausgabe des gewünschten $xmlout=fopen($xmlfile,“w“); Listing 2 flock($xmlout,2); <?xml version=“1.0“ encoding=“ISO-8859-1“?> $info=date(“d.m.Y &#8211; H:i:s“,time()); <!-- DTD zu mspec.xml --> $out=“<?xml version=\“1.0\“ encoding=\ <!ELEMENT mass-spectrum (dataset)> “ISO-8859-1\“?> <!DOCTYPE mass-spectrum SYSTEM \“mspec.dtd\“> <!ELEMENT dataset (data+)> <!ELEMENT data (mass,intensity)> <!ELEMENT mass (#PCDATA)> <mass-spectrum>\n\n“; <!ELEMENT intensity (#PCDATA)> fwrite($xmlout,$out); <!ATTLIST dataset compound-name CDATA #REQUIRED sum-formula CDATA #REQUIRED $out=“ <dataset compound-name=\““.$verbindung.“\“ info CDATA #IMPLIED sum-formula=\““.$formel.“\“ info=\““.$info.“\“ scale CDATA #IMPLIED scale=\““.$scale.“\“ trans=\““.$trans.“\“>\n\n“; trans CDATA #IMPLIED fwrite($xmlout,$out); > for($i=0;$i<count($datensatz);$i+=2) Listing 3 { <?xml version=“1.0“ encoding=“ISO-8859-1“?> $out=“ <data>\n“; <!DOCTYPE mass-spectrum SYSTEM “mspec.dtd“> $out=$out.“ <mass>“.$datensatz[$i].“</mass>\n“; $intensity=$datensatz[$i+1]/10; <mass-spectrum> $out=$out.“ <intensity>“.$intensity.“</intensity>\n“; $out=$out.“ </data>\n\n“; <dataset compound-name=“...“ sum-formula=“...“ fwrite($xmlout,$out); info=“...“ scale=“...“ trans=“...“> } <data> $out=“ </dataset> <mass>...</mass> </mass-spectrum>\n“; </data> <intensity>...</intensity> fwrite($xmlout,$out); <!-- weitere Datensaetze --> flock($xmlout,3); fclose($xmlout); </dataset> // ... </mass-spectrum> ?> Ausgabe 2/02 Endformats, wobei per Radio Button SVG oder HTML zur Wahl stehen. Im bereits auszugsweise zitierten PHP-Skript daten. php ist weiterer Code zur Ansteuerung des auf dem Webserver installierten XSLT-Prozessors enthalten (Listing 4). Die Umformung der XML-Quelldaten aus mspec.xml erfolgt durch die XSL-Stylesheets mspec_svg.xsl bzw. mspec_html. xsl. Da die auf der Heft-CD vorliegende HTML-Vorlage an dieser Stelle wohl keiner besonderen Erläuterung bedarf, soll nur auf die SVG produzierende Vorlage eingegangen werden. Listing 5 enthält nur den für die Transformation relevanten Code. Das vollständige Stylesheet enthält darüber hinaus eine Reihe von xsl:comment-Aufrufen, die das jeweilige Ausgabedokument um Kommentare ergänzen. Wichtig ist hier zunächst die Angabe der Ausgabemethode xml bei xsl:output sowie weiterer SVG-spezifischer Deklarationen. Im sich anschließenden xsl: template-Block werden nach dem Festlegen von externen JavaScript- und CSSReferenzen für das SVG-Ergebnisdokument die Koordinatenachsen und deren Beschriftung definiert. Die Erzeugung der Spektrallinien über das SVG-Element line bildet neben der Ausgabe der beschreibenden Texte den Kern dieses Stylesheets. Innerhalb einer xsl:for-eachKontrollstruktur werden nacheinander alle Linien abgearbeitet und die nötigen Attribute x1, x2 und y2 mit xsl:attribute eingebaut und mit Werten belegt (y1 bleibt auf dem festen Wert 550). Die zur maximalen Intensität gehörende Linie (100%Peak) ist rot hervorgehoben, während alle anderen Linien blau dargestellt werden. Dazu dienen entsprechende CSS-Definitionen (Klassen). Die aus dem temporären XML-Dokument generierte SVG-Struktur wird ebenfalls im lokalen Dateisystem des Webservers als mspec.svg abgespeichert und über das object-Element in ein HTMLDokument eingebunden und an den Browser ausgeliefert. Zur Vermeidung von Pro- 69 Massenspektren mit SVG Abb. 3: Summenformel-Suchmaske und gefundene Verbindungen Abb. 2: Ansicht des Inhaltes der Datenbanktabelle msdata mit phpMyAdmin blemen durch lokales Caching der SVGGrafiken wurden HTTP-Header im PHPSkript sowie META-Tags im AusgabeHTML-Dokument eingesetzt. Allerdings war dennoch zu beobachten, dass der Internet Explorer – im Gegensatz zu Opera, Netscape 6.x/Mozilla – neu generierte Grafiken nicht darstellte und stattdessen ältere Dateiversionen aus dem Cache holte. Dieses Verhalten konnte schließlich durch Anhängen des aktuellen Zeitstempels als Parameter an den Dateinamen im data-Attribut des <object>-Tags verhindert werden. Abbildungen 4 und 5 (siehe Seite 72) zeigen die visuellen Ergebnisse der Transformation nach SVG sowie HTML. Zur SVG-Anzeige wird auf der Client-Plattform der Adobe SVG Viewer 3.0 vorausgesetzt [5]. Zu beachten ist noch, dass die hier verwendete Vorlage nur die Massenzahlenskala bis 150 abdeckt, was jedoch für die Beispiele ausreicht. In der Online-Version der Anwendung [6] werden bei Bedarf alternative XSL-Vorlagen für höhere Massenzahlenbereiche verwendet. An dieser Stelle sollte angemerkt werden, dass Mozilla-Browser zurzeit leider <xmlpraxis> nur bis zur Preview-Version 0.9.9 mit dem aktuellen Adobe-Plugin zusammenarbeiten, da in den 1.0 Release Candidates und in der finalen Version 1.0 ein noch unfertiges, aber dennoch von Adobe verwendetes API geändert wurde. Reproduzierbare Abstürze beim SVG-Zugriff sind die traurige Folge. Ein Workaround besteht in der Verwendung von <iframe src=“...“> statt <object data=“...“> zur SVG-Einbettung nach einer geeigneten Browserabfrage [7]: $ua=$HTTP_SERVER_VARS[„HTTP_USER_AGENT“]; if(strstr($ua,“Gecko“) && !strstr($ua,“rv:0.“)) { // Ausgabe von HTML-Code fuer iframe // ... } else { // Ausgabe von HTML-Code fuer object // ... SVG-Dokumente arbeiten die Funktionen ShowTooltip() und HideTooltip(), die beim Berühren der Linien mit dem Mauszeiger so genannte Tooltips mit dem jeweiligen Wertepaar in der Form [m/z=..., I=...%] ein- bzw. ausblenden (siehe auch Abb. 4). Damit lassen sich vor allem kleinere Peaks schnell erfassen. Details zu Aufbau und Anwendung dieser Funktionen werden unter [8] behandelt. Clientseitig wird ebenfalls JavaScript eingesetzt. Zur optimalen Ausgabe der Grafiken werden die Maße des Ausgabefensters (= unterer Teil des Framesets) ausgelesen und an das PHP-Skript daten.php über hidden-Formularfelder weiter gereicht. Aus diesen Daten werden Parameter für die Skalierung bzw. Verschiebung der SVG-Inhalte berechnet und über die bereits genannten Attribute scale und trans in den XSLT-Prozess einbezogen und letztlich auf das gesamte Koordinatensystem als Gruppierung angewendet: } <g transform=“scale(...) translate(...,...)“> Zusatzfunktionen Etwas Komfort wird durch zusätzliche JavaScript-Funktionen erzielt. Innerhalb der <!-- Inhalt der Grafik --> </g> Listing 5 <?xml version=“1.0“ encoding=“ISO-8859-1“?> indent=“yes“ <xsl:stylesheet version=“1.0“ xmlns:xsl=“http://www.w3.org/1999/XSL/Transform“> /> <!-- mspec_svg.xsl --> <xsl:template match=“/“> <xsl:output <!-- HTTP-Basispfad fuer die externen CSS- und JavaScript-Dateien --> method=“xml“ <!-- lokal z. B. http://localhost/mspec/ --> doctype-public=“-//W3C//DTD SVG 1.0//EN“ <xsl:variable name=“basepath“>http://ktd.et.fh-merseburg.de/~tm/mspec/ </xsl:variable> doctype-system=“http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd“ encoding=“ISO-8859-1“ version=“1.0“ <!-- PI fuer externes Stylesheet erzeugen --> media-type=“image/svg+xml“ <xsl:processing-instruction name=“xml-stylesheet“>href=“<xsl:value-of select= 70 Ausgabe 2/02 Massenspektren mit SVG <xmlpraxis> Fortsetzung Listing 5 “$basepath“/>mspecsvg.css“ type=“text/css“</xsl:processing-instruction> <svg xmlns=“http://www.w3.org/2000/svg“ <xsl:for-each select=“mass-spectrum/dataset/data“> <line y1=“550“> xmlns:xlink=“http://www.w3.org/1999/xlink“> <xsl:attribute name=“x1“> <title>Massenspektrum in SVG</title> <xsl:value-of select=“100+5*number(mass)“ /> <desc>Darstellung der Spektrallinien auf der Basis von XML-Daten</desc> </xsl:attribute> <defs> <xsl:attribute name=“x2“> <!-- Referenzierung der externen JavaScript-Funktionen --> <xsl:value-of select=“100+5*number(mass)“ /> <script xlink:href=“{$basepath}mspecsvg.js“ type=“text/javascript“/> </xsl:attribute> </defs> <xsl:attribute name=“y2“> <g> <xsl:value-of select=“550-5*number(intensity)“ /> <xsl:attribute name=“transform“> </xsl:attribute> <xsl:text>scale(</xsl:text><xsl:value-of select=“mass-spectrum/dataset/@scale“/> <xsl:text>) </xsl:text><xsl:text>translate(</xsl:text><xsl:value-of select= “massspectrum/dataset/@trans“ /><xsl:text>,0)</xsl:text> </xsl:attribute> <xsl:choose> <xsl:when test=“number(intensity) = 100“> <xsl:attribute name=“class“>rot</xsl:attribute> </xsl:when> <!-- Achsen zeichnen --> <xsl:otherwise> <polyline points=“100,50 100,550 850,550“/> <xsl:attribute name=“class“>normal</xsl:attribute> </xsl:otherwise> <!-- x-Achsenteilung --> </xsl:choose> <line x1=“100“ y1=“550“ x2=“100“ y2=“560“/> <!— ... —> <xsl:attribute name=“onmouseover“>ShowTooltip(evt,’m/z=<xsl:value-of select= <line x1=“850“ y1=“550“ x2=“850“ y2=“560“/> “mass“ />, I=<xsl:value-of select=“intensity“ />%’)</xsl:attribute> <!-- x-Achsenbeschriftung --> <text x=“420“ y=“600“ class=“achsen“>Massenzahl [m/z]</text> </line> <text x=“97“ y=“575“>0</text> <!-- ... --> </xsl:for-each> <text x=“840“ y=“575“>150</text> <a xlink:href=“{$basepath}“ target=“_top“> <!-- y-Achsenteilung --> <text id=“textlink“ x=“100“ y=“600“ class=“achsen“ style=“font-size: 10px; fill: #00C“ <line x1=“90“ y1=“550“ x2=“100“ y2=“550“/> onmouseover=“TextHover(‘textlink’,’#FF0000’,’underline’)“ <!— ... —> onmouseout=“TextHover(‘textlink’,’#0000CC’,’none’)“>MSpec::SVG</text> <line x1=“90“ y1=“50“ x2=“100“ y2=“50“/> </a> <!-- y-Achsenbeschriftung --> <text x=“162“ y=“600“ class=“achsen“ style=“font-size: 10px; fill: #00C“> <text x=“70“ y=“300“ class=“achsen“ transform=“translate(-250, 410) rotate(-90)“> <xsl:text> | </xsl:text><xsl:value-of select=“mass-spectrum/dataset/@info“ /> Intensität [%]</text> </text> <text x=“77“ y=“555“>0</text> <!-- ... --> </g> <text x=“64“ y=“55“>100</text> </g> <!-- Ueberschrift --> <text x=“100“ y=“30“ class=“titel“> <!-- Rechteck und Textfeld fuer Tooltips --> Massenspektrum von <xsl:value-of select=“mass-spectrum/dataset/@compound-name“ <rect id=“ttr“ x=“0“ y=“0“ rx=“5“ ry=“5“ width=“100“ height=“18“ /> style=“visibility: hidden“/> <xsl:if test=“mass-spectrum/dataset[@sum-formula != ‘’]“> (<xsl:value-of select= <text id=“ttt“ x=“0“ y=“0“ style=“visibility: hidden“>dyn. Text</text> “massspectrum/dataset/@sum-formula“ />)</xsl:if> </text> </svg> <!-- Spektrum generieren --> </xsl:template> </xsl:stylesheet> <g onmouseout=“HideTooltip()“> Ausgabe 2/02 71 Massenspektren mit SVG Abb. 5: Ansicht der HTML-Ausgabe im Browser Abb. 4: Ansicht der SVG-Ausgabe im Browser Ausblick Mit der Anwendung MSpec::SVG kann auf der Basis der mitgelieferten Quellcodes über einen lokalen Webserver und den Aufruf von http://localhost/mspec/ oder direkt online unter [6] experimentiert werden. Externe Nutzer können wie im mitgelieferten Beispielprojekt nur auf die Daten der Verbindungen mit den Summenformeln C4H8 und C6H5ClO zugreifen. Die Bedeutung der einzelnen Dateien wird im Kasten „Module von MSpec::SVG“ näher erläutert. Im Lehrbetrieb hat sich die Arbeit an diesem Projekt bereits ausgezahlt. Studierende der Technischen Dokumenta- Module von MSpec::SVG +/- Dateiname Funktion [+] ausgabe.htm Ausgabeteil des Framesets (unten). [+] daten.php PHP-Skript zur Steuerung der Ausgabe von SVG bzw. HTML. [-] db.php Include-Datei mit den Verbindungsinformationen zum Datenbankserver. [+] index.htm Startdokument zum Aufbau des Framesets. [-] mspec.sql <xmlpraxis> tion werden zur tieferen Beschäftigung mit Webtechnologien angeregt und angehende Chemieingenieure können die Anwendung im Rahmen von Praktika zur chemischen Analytik ebenfalls nutzen. Dr. Thomas Meinike besitzt langjährige Erfahrung als Programmierer, Autor und EDV-Dozent. Seit 1997 ist er als Lehrkraft im Studiengang Kommunikation und Technische Dokumentation im Fachbereich Elektrotechnik, Informationstechnik und Medien an der FH Merseburg auf den Gebieten Online-Dokumentation und Website-Entwicklung tätig. SQL-Dump zum Anlegen der Datenbank mspec und der Tabelle msdata z. B. mit mysql -h localhost -u username -p < mspec.sql oder mit phpMyAdmin. [+] mspec.css Stylesheet-Definitionen für die HTML-Seiten. Links & Literatur [-] mspec.dtd Document Type Definition für die temporären XML-Dokumente. [+] mspec.gif Bild mit dem Prinzip der Verarbeitung (erscheint auf der Startseite). [1] “Eight peak index of mass spectra”, Mass Spectrometry Data Center, 4. ed., Cambridge, 1991. [+] mspec.js JavaScript-Funktionen für die HTML-Seiten. [+] mspec.svg SVG-Platzhalterdatei zur Ablage auf dem Webserver (Schreibrechte erforderlich). [-] mspec.xml XML-Platzhalterdatei zur Ablage auf dem Webserver (Schreibrechte erforderlich). [+] mspecsvg.css Stylesheet-Definitionen für die generierten SVG-Dokumente. [+] mspecsvg.js JavaScript-Funktionen für die generierten SVG-Dokumente. [-] mspec_svg.xsl XSL-Stylesheet zur Ausgabe von SVG. [-] mspec_html.xsl XSL-Stylesheet zur Ausgabe von HTML. [+] suchen.htm Suchmaske zur Eingabe der Summenformeln, Startdatei des Framesets (oben). [+] verbind.php PHP-Skript zur Verarbeitung der Suchanfragen. Hinweis: Unterhalb des DocumentRoot-Verzeichnisses des Webservers müssen die mit [+] gekennzeichneten Dateien liegen. Alle anderen Dateien können/sollten in einem nicht über HTTP zugänglichen Webserver-Pfad abgelegt werden, wobei sich die Änderung einiger Pfadangaben in den PHP-Skripts erforderlich macht. 72 [2] W3C-Dokumente zu SVG: www.w3.org/Graphics/SVG/ [3] M. Knobloch, „XML in Farbe!“, XML & Web Services Magazin 1.02, S. 67-71. [4] T. Meinike, „Grafik-Tagwerk“, Internet Professionell 7/2002, S. 77-79. [5] Adobe SVG Viewer: www.adobe.com/svg/viewer/install/ main.html [6] MSpec::SVG online: ktd.et.fh-merseburg.de/~tm/mspec/ [7] Adobe SVG-Viewer und Mozilla 1.0: www.styleassistant.de/tips/tip91.htm [8] Tooltip-Funktionen für SVG: www.styleassistant.de/tips/tip80.htm Ausgabe 2/02