XSL in der Praxis
Anwendungsbeispiele für die eXtensible Stylesheet Language
Andreas Kü[email protected]
XML One 2000
XSL-Familie• XSL Transformation ( XSLT )
http://www.w3.org/TR/xslt• XML Path Language ( XPath )
http://www.w3.org/TR/xpath• Formatting Objects ( FO )
http://www.w3.org/TR/xsl
XPath• Selektionssprache zur Auswahl von
Mengen von Elementen• Navigation innerhalb des XML-Baums• Formulierung von Bedingungen• Logische Operatoren
XSLT• Transformationssprache zur Überführung
eines XML-Dokumentes in eine andere Struktur / Format
• Deklarativ, nicht prozedural• Regelbasiert
XPath Beispiele
Pfad : ‘//PLZ’
Resultat :Element mit dem Namen ‘PLZ’ irgendwo im Dokument
Person
NameAdresse
Strasse
Ort
PLZ
XPath Beispiele
Pfad : ‘/*/Adresse [ ./Ort=“Köln”]’
Resultat :Adress-Element, dessen Kind-Element ‘Ort’ den Wert ‘Köln’ hat
Person
NameAdresse
Strasse
Ort
PLZ
‘Köln’
XSLT Stylesheet
<xslt:stylesheetxmlns:xslt=“http://www.w3.org/XSL/transform/1.0”xmlns=“http://www.w3.org/TR/REC-html40” >
...
</xslt:stylesheet>
XSLT Template<xsl:template match=“/” >
<html> <head> <title>A Stock Order</title> </head>
<xsl:apply-templates select=“order”>
</html>
<xsl:template />
Einige XSLT Parser• Xalan
– C++ und Java-Versionen– http://www.apache.org
• Microsoft XMLParser– http://msdn.microsoft.com/downloads/tools/xmlparser/xmlparser.asp
• XSL:P– Java mit ECMAScript-Einbettung– http://www.clc-marketing.com/xslp
• The XML Cover Pages– Übersicht über Parser, Tools, Newsgroups usw.– http://www.oasis-open.org/cover/xsl.html
Parser API// Instantiate an XSLTProcessor.org.apache.xalan.xslt.XSLTProcessor processor = org.apache.xalan.xslt.XSLTProcessorFactory.getProcessor(); // Create the 3 objects the XSLTProcessor needs // to perform the transformation.org.apache.xalan.xslt.XSLTInputSource xmlSource = new org.apache.xalan.xslt.XSLTInputSource (xmlSourceURL);
org.apache.xalan.xslt.XSLTInputSource xslSheet = new org.apache.xalan.xslt.XSLTInputSource (xslURL);
org.apache.xalan.xslt.XSLTResultTarget xmlResult = new org.apache.xalan.xslt.XSLTResultTarget (outputURL);
// Perform the transformation.processor.process(xmlSource, xslSheet, xmlResult);
Quelle : Xalan-Dokumentation, http://www.apache.org
Anwendungsbeispiele• Besser als printf
– Sprach- und plattformunabhängiges Meldungskonzept
• Code Generator– Testmethoden aus dem Objektmodell erzeugen
• EAI Infrastruktur– Realisierung einer Integrationsarchitektur
Besser als printf• Meldungen eines C-Programms :
printf( “Sie haben %d neue Mails”, nAnzahl );
• Ausgabe mittels C++ Streams :cout << “Sie haben “ << nAnzahl << “ neue Mails” << endl;
• Java-Version :System.out.println( “Sie haben “ + nAnzahl + “ neue Mails” );
Printf reicht doch, oder ?• Internationalierung
– Wie unterstützt man mehrere Sprachen ?• Multi-Channel-Fähigkeit
– Wie nutzt man verschiedene Ausgabemedien (Browser, WAP, Pager, Konsole, … ) ?
• Mandantenfähigkeit– Outsourcing-Dienstleister ?
Indirektion mittels XSLT<?xml version="1.0"?><xsl:stylesheet xmlns:xsl= "http://www.w3.org/XSL/Transform/1.0">
<xsl:template match="/message">Sie haben <xsl:value-of select=“anzahl“/> neue Mails. </xsl:template></xsl:stylesheet>
“Sie haben 3 neue Mails.”
<?xml version="1.0"?><message> <anzahl>3</anzahl> ...</message>
Daten-Document
Transformationsregel
Codefragment : Document erzeugen
...
Message msg = new Message( “Mail Info” );
msg.append( “anzahl”, nMails );
for( int i = 0; i < nMails; i++ ) { msg.append( “mail/sender”, mails[ i ].sender() ); msg.append( “mail/subject”, mails[ i ].subject() );}
msg.send();
...
Codefragment zum Erzeugen einer Meldung, in Java.
Beispiel-Document<?xml version="1.0"?><message> <anzahl>3</anzahl> <mail> <sender>Heinz Meier</sender> <subject>Terminbestätigung Donnerstag</subject> </mail> <mail> <sender>Heinz Meier</sender> <subject>I love you</subject> </mail> <mail> <sender>MailMaster</sender> <subject>!! Virenwarnung !!</subject> </mail></message>
Erzeugtes Daten-Document
Codegenerator• Metainformationen liegen i. d. R. in einem
Objektmodell bereit.• Erstellung von Testmethoden ist eine
unbeliebte und fehlerträchtige Aufgabe.• Generierung von Testmethoden aus dem
Objektmodell kann sinnvolle Ergänzung darstellen.
XML Metadata Interchange Format (XMI )
• Von der OMG standardisiertes Format zur Darstellung Metainformationen ( z.B. Objektmodelle, Use Cases, Sequenzdiagramme ).
• Breite Unterstützung ( ArgoUML, Rose, TogetherJ ).
• Tool zur Transformierung *.mdl nach *.xmi bei IBM http://www.alphaworks.ibm.com.
XML Metadata Interchange Format (XMI )
• UML-Meta-Metastruktur.• Bekannte Begriffe der UML werden
genutzt.• Unhandliche DTD ( ca. 500 kBytes )
XMI-ModellPackage ‚Foundation.Core‘, View ‚Backbone‘
Element
GeneralizableElementisRoot : BooleanisLeaf : BooleanisAbstract : Boolean
Interf ace ClassisActiv e : Boolean DataType
Namespace
Modelname : Namev isibility : Visibility Kind
0..1
*
+namespace
0..1
+ownedElement
*
Constraintbody : BooleanExpression
1..*
*
+constrainedElement1..*
+constraint
*
Methodbody : ProcedureExpression
Operationspecif ication : UninterpretedisPoly morphic : Booleanconcurrency : CallConcurrency Kind *1..1
+method
*
+specif ication
1..1
Behav ioralFeatureisQuery : Boolean
FeatureownerScope : ScopeKind
Parameterdef aultValue : Expressionkind : ParameterDirectionKind
0..1
*
+behav ioralFeature
0..1
+parameter*
StructuralFeaturemultiplicity : Multiplicitychangeable : ChangeableKindtargetScope : ScopeKind
Classif ier1..1
*
+owner
1..1
+f eature*
1..1
*
+ty pe
1..1
+parameter
*
1..1 *
+ty pe
1..1
+structuralFeature
*
*
*
+specif ication
*
+realization*
AttributinitialValue : Expression
Mini-ModellFahrzeug
laenge : Long
Radradius : Long
AutofhrgstNr : Long
holeGeschwindigkeit()setzeFhrgstNr() 0..*1 0..*1
Simple.mdl
Simple.mdl xmiToolkit Simple.xmi
Transformation ‚XMI zu Code‘ (1)<?xml version='1.0'?><xsl:stylesheet xmlns:xsl='http://www.w3.org/XSL/Transform/1.0'> <xsl:output method="text" media-type="text/plain"/>
<xsl:template match="/">// Test-Methoden
<xsl:apply-templates select="//Foundation.Core.Class [@xmi.id]"/> </xsl:template> <xsl:template match="Foundation.Core.Class"> <xsl:variable name="className" select="Foundation.Core.ModelElement.name" /> <xsl:apply-templates select=".//Foundation.Core.Operation [@xmi.id ]"> <xsl:with-param name="className" select="$className" /> </xsl:apply-templates> </xsl:template>
Selektion der Klassen
Transformation ‚XMI zu Code‘(2)<xsl:template match="Foundation.Core.Operation"> <xsl:param name="className" /> <xsl:variable name="methodName"><xsl:value-of select="$className" />::<xsl:value-of select="Foundation.Core.ModelElement.name" /></xsl:variable>/* * Test fuer Methode : '<xsl:value-of select="$methodName" />' */ cout << "<xsl:value-of select="$methodName" />() = " << <xsl:value-of select="$methodName" />( <xsl:for-each select=".//Foundation.Core.Parameter [@xmi.id and ./Foundation.Core.Parameter.kind/@xmi.value!='return']"> <xsl:variable name="idref" select="./Foundation.Core.Parameter.type/Foundation.Data_Types.Primitive/@xmi.idref"/> <xsl:variable name="type" select="//Foundation.Data_Types.Primitive [@xmi.id=$idref]/Foundation.Core.ModelElement.name"/> <xsl:choose> <xsl:when test='$type="String"'> "TEST" </xsl:when> <xsl:when test='$type="Long"'> 123 </xsl:when> <xsl:otherwise> // Fehler, Unerwarteter Typ eines Parameter </xsl:otherwise> </xsl:choose> <xsl:if test="position() != last()">, </xsl:if> </xsl:for-each>) << endl; </xsl:template></xsl:stylesheet>
Selektion der Methoden und Parameter
Transformation ‚XMI zu Code‘(3)// Test-Methoden
/* * Test fuer Methode : 'Auto::holeGeschwindigkeit' */ cout << "Auto::holeGeschwindigkeit() = " << Auto::holeGeschwindigkeit( ) << endl; /* * Test fuer Methode : 'Auto::setzeFhrgstNr' */ cout << "Auto::setzeFhrgstNr() = " << Auto::setzeFhrgstNr( 123 ) << endl;
Erzeugter Code
EAI Infrastruktur• IT-Abteilungen unter Stress:
– Data Warehouse– Customer Relationship Management– Enterprise Resource Planning– Workflow– eCommerce– Merger / Aquisitions
– Wartung / Weiterentwicklung von ‘Altlasten’– 99.999 % Verfügbarkeit ist selbstverständlich
Down-loadfile
Down-loadfile
Down-loadfile
Screenscrape
Screenscrape
Screenscrape
Screenscrape
Trans-action
file
Trans-action
file
Trans-action
file
Trans-action
file
Messagequeue
Messagequeue
Messagequeue
Sockets
SocketsORB
Message
RPC
Message RPC
CICS gateway
APPC
APPC
CICS gateway
ORB
Anwendungs- und Schnittstellen-Spaghetti
Standard Releases
1997 1998 1999 2000 2001 2002 2003
Migrationsunterstützung /-fähigkeit durch den Anbieter
Markt- und User-Anforderungen
Die Wartungslücke bei Paketlösungenbis zum Jahr 2003 werden mindestens 66% aller Anpassungen nur außerhalb der Produkte und
Entwicklungstools der Paketanbieter realisiert werden können
DatenMigration
Parameter Migration
Erweiterung / Migration von Anpassungen
Metadaten-/Versions- Management
Schnittstellen-Management
Quelle
1997 1998 1999 2000 2001 2002 2003
Entwicklung der Implementierung neuer Anwendungen nach unterschiedlichen Realisierungsansätzen
100%
“Selbst-gestrickte”,eigene Integrationslösung
Integration überArchitektur
Integration von Paketlösungen
Die Integrationsproblematik verlagert sich
Quelle
Warum ist so eine EAI-Infrastruktur / Architektur wichtig?
• Liefert eine Anleitung und hilft Geschäftsprozeß- und technische Komplexitäten umzusetzen
• Führt zu verkürzten Auslieferungszeiten, geringeren Wartungs- und Anpassungsaufwänden
• Stellt Skalierbarkeit, Flexibilität, Performance und andere wichtige Systemanforderungen sicher
• Hilft Software-Entwicklungsprojekte in kleinere Einheiten zu zerlegen und Parallelentwicklungen zu koordinieren
• Minimiert oder verhindert langfristig “big-bang” Integrationsprobleme
• Spart mittel- und langfristig enorme Kosten
NeueAnwendungen
eigene, teilweise
redundante Datenbasis
Anwendungen bedingt durch Mergers, Acquisitions und / oder Partner
Host-basierteAnwendungen Gekaufte
Standardpakete, Komplettlösungen
eigene, teilweise
redundante Datenbasis
Wo ist die Integrationsstrategie ?
Die Daten-Zentrierte Integration
Drei Integrationsansätze gegenübergestelltMultistep Process
Message-Orientierte Integration (MOI)
Composite Application Pattern (CAP)
• Mehrere Prozesse• Mehrere Schritte• One-way, asynchrone
Interaktionen• im Batch oder sofort,
individuelle Datenbereitstellg.• Systeme sind physisch
unabhängig• Systeme sind logisch
unabhängig
• Ein Geschäftsprozeß• Mehrere Schritte• One-way, asynchrone
Interaktionen• im Batch oder sofort,
individuelle Daten-bereitstellungen
• Systeme sind physisch unabhängig
• Systeme sind logisch abhängig
• Ein Geschäftsprozeß• One step• bilaterale, synchrone
Interaktionen• Sofortige, individuelle
Datenbereitstellung• Systeme sind physisch
abhängig• Systeme sind logisch
abhängig
Die Aufgaben der Speiche
Nabe
• Technische Anpassung– Ort– Betriebssystem– Programmiersprache
• Inhaltliche Anpassung– Semantik– Format– Abstraktion / Spezialisierung
Realisierung der Speiche
1. Umsetzung der Daten in ein Document.
2. Transformation mittels XSLT.
3. Transport der serialisierten, transformierten Daten ( z.B. mit CORBA, RMI, COM+ ).Nabe
1
2
3
Realisierung der Speiche (1)
• Abbilden einer Struktur in ein Baum ‘per Hand’ ( siehe ‘msg.append()’ ).
• Generierung des Adapters aus vorhandenen Modellen.
• Zugriff auf Daten aus einer JDBC-DB mittels XLE.
• Extraktion von Daten aus beliebigen Textquellen ( z.B. HTML ) mit JEDI.
Nabe
1
2
3
Realisierung der Speiche (2)
• Einsatz von XSLT– Umsetzung von Inhalten:
‘Wahr’ -> ‘true’
– Umbenennung von Knoten und Attributen:‘Versicherter’ -> ‘Kunde’
– Umstrukturierung von Dokumenten: ‘Adresse’ -> ‘Lieferanschrift’ und ‘Rechnungsanschrift’
Nabe
1
2
3
Realisierung der Speiche (3)
• Transport durch Standard-Middleware ( z.B. CORBA )– Sprach- und
Betriebssystemunabhängigkeit.– Transparenter
Transportmechanismus.– Höherwertige Dienste stehen bereit
( z.B. Security-Service ).– Transaktionssicherheit bei Einsatz
eines OTS.Nabe
1
2
3
Inkrementelle Geschäftspartnerschaften
Potential
Ohne durchgängigeIntegrationslösung
Vorteile / Vorsprung aufgrund von konsequenter Interenterprise Daten- und Prozeßintegration
LostOpportunity
Opportunity Gap
Mainframe ServicequalitätVerfügbarkeit
Sicherheit
Effiziente, leading-edge-Lösungen
gekaufte“Komplettlösung”
LangfristigeMachbarkeit
Verläßlichkeit
ProduktivitätTime-to-Market
Geringe Einstiegs-kosten
OpportunistischeAnwendunge
n
System- / Basis-Anwendunge
n
Quelle
Zweiteiliger Ansatz
XSLT Fazit :• Flexibles Werkzeug.• Standardisiert durch
W3C.• Breite Unterstützung
in der Industrie.• Open Source
Implementierungen.
• Weitschweifigkeit.• Proprietäre
Erweiterungs-mechanismen.
• Bewährungsprobe im Hochlastbereich steht noch aus.
Die EntwicklungDie wichtigsten Motoren für EAI und das “flexible Unternehmen”
Im neuen Millennium
• E-Business•DataWarehouse, DataMining•CRM, Supply-Chain-Mgmt,
•ERP, Workflow• Process Integration
Grad derProzeß-
Ausnahmen
Hoch
Gering
Prozeß-KomplexitätGering Hoch
In der 80iger-90igern
• Eigene Lösungen• Rechnungs- u.
Finanzwesen• Dokumenten-Mgmt
Kritische Erfolgsfaktoren
Anforderungen an das Unternehmens-Management
• Entwicklung flexibler Geschäftsmodelle • Redefinition / Reengineering von Rollen und Funktionen• Entwicklung neuer Geschäftsprozesse
Anforderungen ans IT-Management
• Strategie zur schnellen und sicheren Anwendungsintegration (EAI-Strategie)
• Flexibilität — Build/Buy/Outsource • Effizientes Infrastruktur-Management• absolute Gewährleistung von Sicherheit, Verfügbarkeit und
Datenschutz
Steigende Markt-segmentierung
SchnelligkeitTime to Market
KundenspezifischeAnforderungen
E-Commerce
Neue Geschäftsfelder,VertriebskanäleGlobalisierung
SteigenderWettbewerbsdruck
Outsourcing Partner,Mergers&Acquisitions
bedingen
E A I
InterenterpriseApplicationIntegration
VirtuelleUnternehmen
Top Related