XML und Zope
Nik Klever
klevermultimediafh-augsburgde
Abstract Zope ist ein Open Source Middlewareprodukt welches auf der Skriptspra-che Python aufbaut Zope ist als Applikationsserver sowohl ein Webserver mit einemwebbasiertem Interface als auch eine objektorientierte Datenbank Parsed XML istein auf dem Python Expat aufbauender XML Parser der als Produkt fur Zope entwi-ckelt wurde und die standardisierte DOM-Schnittstelle enthalt Zusammen mit PageTemplates einer auf Attributen basierten Erweiterung von XHTML wird hiermit furZope die Basis zu einer reinen XML Verarbeitung mit XHTML Anzeige gelegt AlsBeispiel wird eine einfache Anwendung fur eine dynamische HTML Navigation ausXML Slide Dokumenten aufgezeigt
1 Einleitung
Zope [Lat00] ist ein Open Source Middlewareprodukt welches auf der Skriptsprache Py-thon [van02] aufbaut Zope ist als Applikationsserver sowohl ein Webserver mit einemwebbasiertem Interface als auch eine objektorientierte Datenbank Dabei wird aber dieIntegration bestehender relationaler Datenbanken sowie die Unterstutzung von Skript-sprachen wie Python und Perl nicht vernachlassigt Applikationsserver Mit Zope selbstwurde ursprunglich eine eigene Markupsprache DTML - Document Template MarkupLanguage - entwickelt die allerdings ihre Wurzel in HTML hat und daher die Strikt-heit von XML vermissen lasst Ein interessanter Aspekt von Zope ist die Produktschnitt-stelle auf dem Zope Kern wurden im Laufe der Zeit verschiedenste Produkte mit unter-schiedlichsten Aufgaben entwickelt Umfangreiche Produkte aus den Bereichen Webshop-Anwendungen [Bee02] Content Management Systeme [Inf02] und Workflow Frameworks[Iuv02] sind ebenso darunter wie kleinere Anwendungen fur Bildergalerien und Abstim-mungen [Pro02] Parsed XML ist ein auf dem Python Expat aufbauender XML Parser derals Produkt fur Zope entwickelt wurde und die standardisierte DOM-Schnittstelle enthaltZusammen mit Page Templates einer auf Attributen basierten Erweiterung von XHTML[Pem00] wird hiermit fur Zope die Basis zu einer reinen XML Verarbeitung mit XHTMLAnzeige gelegt Im folgenden werden anhand eines Beispiels die notwendigen Grundla-gen und Schritte dargelegt um mit Zope diese XML Verarbeitung durchfuhren zu konnenAls Beispiel wird eine einfache Anwendung fur eine dynamische HTML Navigation ausXML Slide Dokumenten aufgezeigt Dabei sind die Slides einfache XML Dokumente miteinem beliebigen Body aus HTML Inhalt
57
2 Zope
Python als Skriptsprache wurde 1990 als Pendant zu Perl von Guido van Rossum mitdem Ziel entwickelt sowohl die Lesbarkeit von Programmen als auch die Objektorien-tierung bereits im Kernel zu integrieren Die Lesbarkeit von Pythonprogammen basiertdarauf dass die Blockstruktur nicht wie bei den meisten bekannten Programmiersprachenauf einer Klammerung basiert sondern auf der Einruckung Ein Block beginnt mit einerEinruckung und endet mit der Ausruckung damit werden Pythonprogamme ubersicht-licher und lesbarer fur externe Programmierer Nahere Informationen zu Python konnenunter [van02] nachgelesen werden Zope wurde 1996 von Jim Fulton als Antwort auf diebestehenden Sicherheitsprobleme und fehlende Objektorientierung in der CGI [CGI02]Programmierung entwickelt Mit Python als Grundlage konnte die Objektorientierung vonvornherein integriert werden Nur einige wenige zeitkritische Teile wurden in C geschrie-ben um die Performance von Zope als Webserver zu verbessern Die Eigenschaften vonZope als Applikationsserver kann man folgendermaszligen zusammenfassen Zope ist einWebserver (der aber nicht benutzt werden muss) besitzt eine webbasierte Schnittstelleenthalt sowohl eine integrierte Objektdatenbank als auch Schnittstellen zur Einbindungrelationaler Datenbanken und unterstutzt verschiedene Skriptsprachen wie Python PerlPHP sowie die Zope-eigene Skriptsprache DTML und andere Die Architektur von Zopebaut auf 4 Schichten auf dem ZServer als Webserver dem ZPublisher fur die Abarbeitungder Requests auf die Objekte (durch den Zope Object Request Broker - ZORB) und denZusammenbau der Objekte dem ZFramework als Schnittstelle zu den Zope Produkten undZODB die Zope Object Database (s Bild 1 nach [Aye00])
3 Page Templates
Die Trennung von Layout und Struktur die sich immer mehr in der Internetgemeinde mitXML [Bra98] CSS [Bos98] und XSL [Adl00] durchsetzt konnte jedoch mit der Zopeeigenen Skriptsprache DTML nicht in der Art und Weise verwirklicht werden wie es ur-sprunglich geplant war DTML ist zum einen nicht wohlgeformt und zum zweiten wird dasLayout einer HTML auf mehrere Objekte ausgelagert sodass insbesondere die Erstellungeines Internet Seiten Layouts mit einem HTML Editor nicht ohne weitere Umformungenin DTML umsetzbar ist Aus diesem Grund wurden 2001 Page Templates als Zope Pro-dukt eingefuhrt die diese Problematik umgehen Page Templates bauen auf zwei MarkupLanguages der Template Attribute Language - TAL - und der Macro Extension TemplateAttribute Language - METAL - auf Beide Markup Languages definieren keine eigenenTags wie bei DTML sondern nur Attribute die auf XHTML Tags angewendet werdenDie Eindeutigkeit der Attribute und die Einbindung in XHTML wird dabei durch die Ver-wendung von Namespace-Prefixes sichergestellt TAL wird dabei mit dem Namespace
xmlnstal=httpxmlzopeorgnamespacestal
und METAL analog mit dem Namespace
58
Abbildung 1 Zope Architektur
xmlnsmetal=httpxmlzopeorgnamespacesmetal
verknupft Der Vorteil der Verwendung von Page Templates liegt dabei auf der Hand Jederbeliebige HTML Editor ist nun von Designern fur die Entwicklung des Internet-Layoutsverwendbar um die HTML Datei danach als Page Template als ein einziges Objekt einfachin Zope einbinden zu konnen Die Logik und Dynamik der entsprechenden Anwendungwird anschliessend mit den TAL- und METAL-Attributen eingebaut Weitere Entwick-lungszyklen sind ebenfalls unproblematisch da die zusatzlichen Attribute von den HTMLEditoren nicht interpretiert und verandert werden
31 Template Attribute Language
Die Template Attribute Language beruht im wesentlichen auf den Attributen content re-place und attributes welche Inhalte von Tags gesamte Tags und Attribute von Tags er-
59
setzen sowie den Attributen define condition und repeat welche Variablen definierenBedingungen abfragen und Schleifen abhandeln Als Beispiel sei hier die Ersetzung deshref-Attributes eines normalen XHTML Anchor Tags vorgefuhrt
lta href=samplelinkhtmltalattributes=href heresubabsolute_urlgt
In diesem Beispiel wird der vom Designer beispielhaft vorgegebene Link im href-Attributdurch einen Ausdruck heresubabsolute url ersetzt Dabei wurde das Schlussel-wort here verwendet welches sich auf den jeweiligen Context in der Zope-Objekthier-archie bezieht sub ist ein entsprechendes Objekt in diesem Context und absolute urleine Methode des Objektmanagers die an alle Objekte vererbt wird und die absolute URLdes entsprechenden Objektes zuruckliefert Ganz ahnlich wird in dem folgenden Beispielder Inhalt des XHTML Paragraph Tags ersetzt
ltp talcontent=structure heregetStorygtmarked ltbgtupltbgt content goes here
ltpgt
Hier wird der Inhalt dieses Tags also marked ltbgtupltbgt content goes hereersetzt durch das Ergebnis welches die Methode getStory aus dem aktuellen Contexthere zuruckliefert Dabei wird die Struktur des Inhalts durch das Schlusselwortstructure beibehalten was bedeutet dass entsprechende XHTML oder XML-Tagsinterpretiert werden und nicht als XML-Entities umschrieben werden Bei der Verwen-dung der Attribute repeat und condition die den Ablauf beeinflussen sehen die Beispielefolgendermassen aus
lttr talrepeat=item pythonrange(10)gtlttd bgcolor=000000
talcondition=repeatitemeventalattributes=bgcolor stringrsquoDCDCDCrsquotalcontent=repeatitemnumbergtEven Numberlttdgt
lttd bgcolor=000000talcondition=repeatitemoddtalattributes=bgcolor stringrsquo000000rsquotalcontent=repeatitemnumbergtOdd Numberlttdgt
lttrgt
In diesem Beispiel werden 10 Zeilen mit einer Spalte erzeugt die jeweils abwechslendgrau fur die geraden Zahlen und weiss fur die ungeraden Zahlen unterlegt sind rangeist dabei eine interne Python Funktion und repeat ein Schlusselwort welches sich auf dasRepeat-Objekt bezieht von dem die Methoden even odd und number fur jeden Schleifen-durchlauf item geerbt werden
60
32 Macro Extension Template Attribute Language
Die Macro Extension Template Attribute Language wird dazu verwendet um immer wie-der auftauchende Ablaufe und Ausdrucke umfangreicherer Art zu definieren und wieder-zuverwenden Hierfur sind die vier Attribute define-macro use-macro define-slot und fill-slot geschaffen worden Als Beispiel sei hier ein einfaches Copyright vorgefuhrt
ltp metaldefine-macro=copyrightgtCopyright 2001ltemgtFoo Bar and Associatesltemgt Inc
ltpgt
Der Aufruf dieses Macros lautet dann folgendermassen
ltb metalusemacro=containermaster_pagemacroscopyrightgt
Macro goes hereltbgt
wobei das Bold-Tag komplett durch das Paragraph-Tag ersetzt wird Die beiden anderenAttribute konnen zusatzlich dazu verwendet werden um slots innerhalb von Macros zudefinieren die dann noch zusatzlich uberschrieben werden konnen
4 Parsed XML
Die Verarbeitung von XML Dokumenten benotigt einen entsprechenden XML Parser Esliegt in einer einheitlichen Umgebung auf der Hand den Vorgang des Parsens durch ei-ne entsprechend integrierte Schnittstelle herzustellen Im Zope Produkt Parsed XML[Faa02] wird diese Schnittstelle zur Verfugung gestellt Im Gegensatz zu dem ProduktPage Templates welches bereits Eingang in die Zope Kern Distribution gefunden hat istParsed XML ein zusatzliches Produkt fur das auch das XML Paket fur Python pyXMLzusatzlich installiert werden muss Parsed XML stellt eine der W3C DOM Level 2 Spe-zifikation [Le 00] entsprechende Schnittstelle (DOM API) fur den Zugriff auf den XMLDOM Baum zur Verfugung Zusatzlich zu der vom W3C definierten DOM Level 2 APIwird in dem Parsed XML Produkt eine weitere API zur Verfugung gestellt die Manage-ableDOM API Diese Schnittstelle berucksichtigt mittels Proxy Objekten die zusatzlichenEigenschaften von Zope wie Management Publishing Traverseability und Security Ei-genschaften die in der W3C API nicht enthalten sind Diese Eigenschaften werden uberdie Python Klassen DOMManageable DOMPublishable DOMTraverseable und DOMIOerstellt und verwaltet Die DOM Level 2 API wird hier nicht vorgefuhrt da sie an anderenStellen in aller Ausfuhrlichkeit erwahnt wird [Le 00] In einer Zope Umgebung in der einwesentlicher Mehrwert auf die Zope Funktionalitaten wie Management Publizieren Tra-versabilitat und Sicherheit gelegt ist ist derzeit Parsed XML der einzig mogliche Weg umXML Dokumente zu parsen
61
Abbildung 2 Architektur des Beispiels
5 Beispiel Dynamische HTML Navigation aus XML Dokumenten
Als Beispiel fur die Anwendung der oben beschriebenen Produkte innerhalb von Zo-pe wird eine dynamische HTML Navigation aus XSD Slide Dokumenten zusammenge-stellt Die Architektur dazu ist in Abbildung 2 abgebildet Grundlage dieser dynamischeHTML Navigation bildet das XML Schema [Fal01] [Tho01] [Bir01] [Bai02] Dokumentslidesxsd (siehe Anhang A) mit dem zum Beispiel folgende XML Dokument Instanzverknupft werden kann
ltxml version=10 encoding=iso-8859-1gtltslide xmlns=httpwwwexamplecomslidesgtlttitlegtDer Titel des VortragslttitlegtltsubtitlegtDer Untertitel des VortragsltsubtitlegtltauthorgtDer Autor des VortragsltcompanygtDie Firma des Autorsltcompanygt
ltauthorgt
62
ltbodygtltslidegt
Werden nun entsprechende Parsed XML Dokumente in einem Ordered Folder abgelegt sobilden diese Dokumente die Menge aller Slides die uber das Page Templateslideshtml (siehe Anhang B) aufgerufen werden In diesem Page Template wird uberden Aufruf des Macros layout ein Default Template aus dem Page Template Dokumentlayouthtml (siehe Anhang C) vorgelegt und die entsprechenden Macro-Slotsnavigationpage header und main aus diesem Template werden durch die obigen fill-slot Be-reiche uberschrieben Das Default Page Template layouthtml ist dabei die HTMLVorlage die von einem HTML Designer als Grundlage fur ein Layout mit jedem HTMLEditor bearbeitet werden kann Der einzige Hinweis dass hier auch Logik eingebaut istsind die drei metalblock Elemente die entsprechende Slots definieren die von dem ei-gentlich aufgerufenen Page Template Dokument slideshtml uberschrieben werdenkonnen
Die Navigation wird dabei uber ein Python Skript geregelt welches eine simple Schleifeuber alle Parsed XML Objekte in dem Ordered Folder legt und die von dem derzeitigenObjekt sowohl das Vorganger Objekt als auch das Nachfolger Objekt berechnet
Die Umwandlung des XML Inhalts aus den Parsed XML Dokumenten erfolgt in demPython Skript xmlnode und wird uber das DOM Level 12 Interface Node und dessenAttribute nodeName nodeType childNodes und firstChild angesprochen
def xmlnode(node name)return the content of a slide document instanceaccording to the second argumentresult = for child in nodechildNodesif childnodeName == nameif len(childchildNodes) = 1if childnodeName == rsquobodyrsquofor i in childchildNodesresult = result + str(i)
return resultelif childnodeName == rsquoauthorrsquoresult = result + str(childfirstChild) + rsquonrsquofor i in childchildNodesif inodeName == rsquocompanyrsquoresult = result + str(ifirstChild)
return resultelif childfirstChildnodeType == nodeTEXT_NODEreturn str(childfirstChilddata)
else
63
return None
Als Beispiel kann die folgende Abbildung 3 eines Vortrags uber Online Graphics withSVG [Kle02] angesehen werden
Abbildung 3 HTML Slide erzeugt aus XML Schema Dokument mittels Parsed XML und PageTem-plates auf Zope
6 Ergebnis
Auch wenn der Open Source Web- und Application-Server Software Zope noch nicht alsreiner XML Webserver betitelt werden kann so ist eine Verarbeitung von XML Dokumen-ten mit einer XHTML Anzeige auch moglich ohne die geschlossene Umgebung von Zopezu verlassen Dafur sind jedoch noch die Zope Produkte (Programmpakete) Parsed XMLund Page Templates notwendig Parsed XML ist ein auf dem Python Expat aufbauenderXML Parser mit einer standardisierten DOM-Schnittstelle der die Eigenschaften von Zo-pe ubernimmt und als API anbietet Zusammen mit Page Templates einer auf Attributenbasierten Erweiterung von XHTML wird somit fur Zope die Basis zur XML Verarbeitungund XHTML Anzeige gelegt Mit dieser Methode XML Dokumente in Zope zu verar-beiten wird eine Moglichkeit geschaffen die Flexibilitat und Erweiterbarkeit von Zope
64
auch bei der XML-Verarbeitung auszunutzen Die vorgezeigte Methode wird mit einemBeispiel einer einfachen Anwendung fur eine dynamische HTML Navigation aus XMLDokumenten mit einer Struktur fur Slides dargestellt
Literatur
[Adl00] Adler etal Extensible Stylesheet Language httpwwww3orgTRxsl 2000
[Aye00] Ayeva et al Zope Book Project httpzdpzopeorgprojectszbook 2000
[Bai02] Baier etal XML Schema Teil 0 1 2 httpwwwedition-w3cde 2002
[Bee02] httpwwwbeehivede 2002
[Bir01] Biron etal XML Schema Part 2 Datatypes httpwwww3orgTRxmlschema-2 2001
[Bos98] Bos etal Cascading Style Sheets httpwwww3orgTRREC-CSS2 1998
[Bra98] Bray etal Extensible Markup Language httpwwww3orgTRREC-xml 1998
[CGI02] httphoohooncsauiuceducaiinterfacehtml 2002
[Faa02] Faassen Parsed XML httpwwwzopeorgmembersfassenParsedXML 2002
[Fal01] Fallside XML Schema Part 0 Primer httpwwww3orgTRxmlschema-0 2001
[Inf02] httpwwwinfraecom 2002
[Iuv02] httpwwwiuvenocom 2002
[Kle02] Klever Online Graphics with SVG httpxmlfh-augsburgdeSVGICL2002 2002
[Lat00] Latteier Pelletier The Zope Book httpwwwzopeorgdocumentation 2000
[LeH00] LeHors et al Document Object Model (DOM) Level 2 Core Specificationhttpwwww3orgTRDOM-Level-2-Core 2000
[Pem00] Pemberton et al XHTML 10 The Extensible HyperText Markup Languagehttpwwww3orgTR2000REC-xhtml1-20000126 2000
[Pro02] httpwwwzopeorgproductsall products 2002
[Tho01] Thompson etal XML Schema Part 1 Structures httpwwww3orgTRxmlschema-12001
[vR02] vRossum Drake Python Reference Manual httpwwwpythonorg 2002
65
Anhang A XML Schema Dokument slidesxsd
ltschema xmlnsxsd=httpwwww3org2001XMLSchemaxmlns=httpwwwexamplecomslidestargetNamespace=httpwwwexamplecomslideselementFormDefault=unqualifiedattributeFormDefault=unqualifiedgt
ltxsdelement name=slidegtltxsdcomplexTypegtltxsdsequencegtltxsdelement name=title type=xsdstringgtltxsdelement name=subtitle type=xsdstring
minOccurs=0gtltxsdelement name=author minOccurs=0gtltxsdcomplexType mixed=truegtltxsdsequencegtltxsdelement name=company type=xsdstring
minOccurs=0gtltxsdsequencegtltxsdcomplexTypegt
ltxsdelementgtltxsdelement name=body minOccurs=0gtltxsdcomplexType mixed=truegtltxsdsequencegtltxsdany namespace=httpwwww3org1999xhtml
minOccurs=0 maxOccurs=unboundedprocessContents=laxgt
ltxsdsequencegtltxsdanyAttribute
namespace=httpwwww3org1999xhtmlgtltxsdcomplexTypegt
ltxsdelementgtltxsdsequencegt
ltxsdcomplexTypegtltxsdelementgt
ltxsdschemagt
Anhang B Page Template Dokument slideshtml
ltxml version=10 encoding=iso-8859-1gtltDOCTYPE HTML PUBLIC
-W3CDTD HTML 401 TransitionalENhttpwwww3orgTRhtml4strictdtdgt
66
lthtml xmlns=httpwwww3org1999xhtml lang=enxmllang=enxmlnstal=httpxmlzopeorgnamespacestalxmlnsmetal=httpxmlzopeorgnamespacesmetaltaldefine=global thisSlideId requestslideglobal thisSlide pythongetattr(herethisSlideId)metaluse-macro=containerlayouthtmlmacroslayoutgt
ltheadgtltdiv metalfill-slot=style talomit-tag=gtltlink talcondition=python
modules[rsquostringrsquo]find(request[rsquoHTTP_USER_AGENTrsquo]rsquoGecko2002rsquo) = -1 rel=stylesheettype=textcsshref=standard_style_mozillacss gt
ltlink talcondition=pythonmodules[rsquostringrsquo]find(request[rsquoHTTP_USER_AGENTrsquo]rsquoWindowsrsquo) = -1 rel=stylesheet type=textcsshref=standard_style_windowscss gtltdivgt
ltheadgt
ltbodygtltdiv class=navigation metalfill-slot=navigation
taldefine=thisSlideId requestslidecurrent pythonstr(hereabsolute_url())+rsquoslides_htmlslide=rsquogt
lttd class=externgtlta href=prev talattributes=href
pythoncurrent+herenavigate(rsquoprevrsquothisSlideId)gtltimg src=prevpng alt=previous gtltagtlttdgt
lttd class=externgtlta href=top talattributes=href
pythoncurrent+herenavigate(rsquotoprsquothisSlideId)gtltimg src=toppng alt=top gtltagtlttdgt
lttd class=externgtlta href=next talattributes=href
pythoncurrent+herenavigate(rsquonextrsquothisSlideId)gtltimg src=nextpng alt=next gtltagtlttdgtltdivgt
ltdiv metalfill-slot=page_header talomit-tag=taldefine=thisSlideId requestslidethisSlide pythongetattr(herethisSlideId)gt
lth1 talcontent=pythonherexmlnode(thisSlidersquotitlersquo)gt
content titlelth1gt
67
lth2 talcondition=pythonherexmlnode(thisSlidersquosubtitlersquo)talcontent=pythonherexmlnode(thisSlidersquosubtitlersquo)talon-error=nothinggtoptional subtitlelth2gt
ltdivgtltdiv metalfill-slot=main class=margins
talomit-tag= taldefine=thisSlideId requestslidethisSlide pythongetattr(herethisSlideId)gt
ltspan class=titletalcondition=pythonthisSlideId==rsquoTitlersquogt
ltemgtltpre class=title
talcontent=pythonherexmlnode(thisSlidersquoauthorrsquo)
talon-error=nothinggtoptional authorltpregtltemgtltspangt
ltspan talcondition=pythonherexmlnode(thisSlidersquobodyrsquo)talreplace=structure
pythonherexmlnode(thisSlidersquobodyrsquo)talon-error=nothinggtoptional bodyltspangt
ltdivgtltbodygt
lthtmlgt
Anhang C Page Template Dokument layouthtml
ltxml version=10 encoding=iso-8859-1gtltDOCTYPE html PUBLIC -W3CDTD XHTML 11EN
httpwwww3orgTRxhtml11DTDxhtml11dtdgtlthtml xmlns=httpwwww3org1999xhtml
lang=de xmllang=dexmlnstal=httpxmlzopeorgnamespacestalxmlnsmetal=httpxmlzopeorgnamespacesmetalmetaldefine-macro=layoutgt
lthead metaldefine-slot=headgtltmeta http-equiv=Content-Type
content=texthtml charset=iso-8859-1 gtlttitlegtltspan talreplace=containertitlegtContext title
68
ltspangtltspan talcondition=containertitle
talreplace=string - gt - ltspangtltspan talreplace=heretitlegtThe titleltspangt
lttitlegtltlink metaldefine-slot=style rel=stylesheet
href=standard_style_netscapecsstype=textcss gt
ltheadgt
ltbodygtlttable class=externgtlttbodygtlttr class=externgtlttd class=externgtlta href=httpwwwfh-augsburgdegtltimg src=fha_logo alt=FH Augsburg gt
ltagtlttdgtlttd class=externgtlttdgt
lttrgtlttr valign=top class=externgtlttd class=externgtlttable class=externgtltcaptiongtltcaptiongtlttbodygtlttr class=navigationgtltmetalblock define-slot=navigationgtlttd class=navigationgtlta href=prevgt
ltimg src=prevpng alt=previous gtltagtlttdgt
lttd class= navigation gtlta href=topgt
ltimg src=toppng alt=top gtltagtlttdgt
lttd class= navigation gtlta href=nextgt
ltimg src=nextpng alt=next gtltagtlttdgt
ltmetalblockgtlttrgtlttbodygt
lttablegtlttdgtlttd class=page_headergt
69
ltmetalblock define-slot=page_headergtlth1gtpage titlelth1gtlth2gtand subtitle will be herelth2gt
ltmetalblockgtlttdgt
lttrgtlttr class=externgtlttd class=externgtlttdgtlttd class=maingtltmetalblock define-slot=maingtltulgtltligtmainltligtltligtinformationltligtltligtwillltligtltligtbe hereltligtltulgt
ltmetalblockgtlttdgt
lttrgtlttbodygt
lttablegtltbodygtlthtmlgt
70
2 Zope
Python als Skriptsprache wurde 1990 als Pendant zu Perl von Guido van Rossum mitdem Ziel entwickelt sowohl die Lesbarkeit von Programmen als auch die Objektorien-tierung bereits im Kernel zu integrieren Die Lesbarkeit von Pythonprogammen basiertdarauf dass die Blockstruktur nicht wie bei den meisten bekannten Programmiersprachenauf einer Klammerung basiert sondern auf der Einruckung Ein Block beginnt mit einerEinruckung und endet mit der Ausruckung damit werden Pythonprogamme ubersicht-licher und lesbarer fur externe Programmierer Nahere Informationen zu Python konnenunter [van02] nachgelesen werden Zope wurde 1996 von Jim Fulton als Antwort auf diebestehenden Sicherheitsprobleme und fehlende Objektorientierung in der CGI [CGI02]Programmierung entwickelt Mit Python als Grundlage konnte die Objektorientierung vonvornherein integriert werden Nur einige wenige zeitkritische Teile wurden in C geschrie-ben um die Performance von Zope als Webserver zu verbessern Die Eigenschaften vonZope als Applikationsserver kann man folgendermaszligen zusammenfassen Zope ist einWebserver (der aber nicht benutzt werden muss) besitzt eine webbasierte Schnittstelleenthalt sowohl eine integrierte Objektdatenbank als auch Schnittstellen zur Einbindungrelationaler Datenbanken und unterstutzt verschiedene Skriptsprachen wie Python PerlPHP sowie die Zope-eigene Skriptsprache DTML und andere Die Architektur von Zopebaut auf 4 Schichten auf dem ZServer als Webserver dem ZPublisher fur die Abarbeitungder Requests auf die Objekte (durch den Zope Object Request Broker - ZORB) und denZusammenbau der Objekte dem ZFramework als Schnittstelle zu den Zope Produkten undZODB die Zope Object Database (s Bild 1 nach [Aye00])
3 Page Templates
Die Trennung von Layout und Struktur die sich immer mehr in der Internetgemeinde mitXML [Bra98] CSS [Bos98] und XSL [Adl00] durchsetzt konnte jedoch mit der Zopeeigenen Skriptsprache DTML nicht in der Art und Weise verwirklicht werden wie es ur-sprunglich geplant war DTML ist zum einen nicht wohlgeformt und zum zweiten wird dasLayout einer HTML auf mehrere Objekte ausgelagert sodass insbesondere die Erstellungeines Internet Seiten Layouts mit einem HTML Editor nicht ohne weitere Umformungenin DTML umsetzbar ist Aus diesem Grund wurden 2001 Page Templates als Zope Pro-dukt eingefuhrt die diese Problematik umgehen Page Templates bauen auf zwei MarkupLanguages der Template Attribute Language - TAL - und der Macro Extension TemplateAttribute Language - METAL - auf Beide Markup Languages definieren keine eigenenTags wie bei DTML sondern nur Attribute die auf XHTML Tags angewendet werdenDie Eindeutigkeit der Attribute und die Einbindung in XHTML wird dabei durch die Ver-wendung von Namespace-Prefixes sichergestellt TAL wird dabei mit dem Namespace
xmlnstal=httpxmlzopeorgnamespacestal
und METAL analog mit dem Namespace
58
Abbildung 1 Zope Architektur
xmlnsmetal=httpxmlzopeorgnamespacesmetal
verknupft Der Vorteil der Verwendung von Page Templates liegt dabei auf der Hand Jederbeliebige HTML Editor ist nun von Designern fur die Entwicklung des Internet-Layoutsverwendbar um die HTML Datei danach als Page Template als ein einziges Objekt einfachin Zope einbinden zu konnen Die Logik und Dynamik der entsprechenden Anwendungwird anschliessend mit den TAL- und METAL-Attributen eingebaut Weitere Entwick-lungszyklen sind ebenfalls unproblematisch da die zusatzlichen Attribute von den HTMLEditoren nicht interpretiert und verandert werden
31 Template Attribute Language
Die Template Attribute Language beruht im wesentlichen auf den Attributen content re-place und attributes welche Inhalte von Tags gesamte Tags und Attribute von Tags er-
59
setzen sowie den Attributen define condition und repeat welche Variablen definierenBedingungen abfragen und Schleifen abhandeln Als Beispiel sei hier die Ersetzung deshref-Attributes eines normalen XHTML Anchor Tags vorgefuhrt
lta href=samplelinkhtmltalattributes=href heresubabsolute_urlgt
In diesem Beispiel wird der vom Designer beispielhaft vorgegebene Link im href-Attributdurch einen Ausdruck heresubabsolute url ersetzt Dabei wurde das Schlussel-wort here verwendet welches sich auf den jeweiligen Context in der Zope-Objekthier-archie bezieht sub ist ein entsprechendes Objekt in diesem Context und absolute urleine Methode des Objektmanagers die an alle Objekte vererbt wird und die absolute URLdes entsprechenden Objektes zuruckliefert Ganz ahnlich wird in dem folgenden Beispielder Inhalt des XHTML Paragraph Tags ersetzt
ltp talcontent=structure heregetStorygtmarked ltbgtupltbgt content goes here
ltpgt
Hier wird der Inhalt dieses Tags also marked ltbgtupltbgt content goes hereersetzt durch das Ergebnis welches die Methode getStory aus dem aktuellen Contexthere zuruckliefert Dabei wird die Struktur des Inhalts durch das Schlusselwortstructure beibehalten was bedeutet dass entsprechende XHTML oder XML-Tagsinterpretiert werden und nicht als XML-Entities umschrieben werden Bei der Verwen-dung der Attribute repeat und condition die den Ablauf beeinflussen sehen die Beispielefolgendermassen aus
lttr talrepeat=item pythonrange(10)gtlttd bgcolor=000000
talcondition=repeatitemeventalattributes=bgcolor stringrsquoDCDCDCrsquotalcontent=repeatitemnumbergtEven Numberlttdgt
lttd bgcolor=000000talcondition=repeatitemoddtalattributes=bgcolor stringrsquo000000rsquotalcontent=repeatitemnumbergtOdd Numberlttdgt
lttrgt
In diesem Beispiel werden 10 Zeilen mit einer Spalte erzeugt die jeweils abwechslendgrau fur die geraden Zahlen und weiss fur die ungeraden Zahlen unterlegt sind rangeist dabei eine interne Python Funktion und repeat ein Schlusselwort welches sich auf dasRepeat-Objekt bezieht von dem die Methoden even odd und number fur jeden Schleifen-durchlauf item geerbt werden
60
32 Macro Extension Template Attribute Language
Die Macro Extension Template Attribute Language wird dazu verwendet um immer wie-der auftauchende Ablaufe und Ausdrucke umfangreicherer Art zu definieren und wieder-zuverwenden Hierfur sind die vier Attribute define-macro use-macro define-slot und fill-slot geschaffen worden Als Beispiel sei hier ein einfaches Copyright vorgefuhrt
ltp metaldefine-macro=copyrightgtCopyright 2001ltemgtFoo Bar and Associatesltemgt Inc
ltpgt
Der Aufruf dieses Macros lautet dann folgendermassen
ltb metalusemacro=containermaster_pagemacroscopyrightgt
Macro goes hereltbgt
wobei das Bold-Tag komplett durch das Paragraph-Tag ersetzt wird Die beiden anderenAttribute konnen zusatzlich dazu verwendet werden um slots innerhalb von Macros zudefinieren die dann noch zusatzlich uberschrieben werden konnen
4 Parsed XML
Die Verarbeitung von XML Dokumenten benotigt einen entsprechenden XML Parser Esliegt in einer einheitlichen Umgebung auf der Hand den Vorgang des Parsens durch ei-ne entsprechend integrierte Schnittstelle herzustellen Im Zope Produkt Parsed XML[Faa02] wird diese Schnittstelle zur Verfugung gestellt Im Gegensatz zu dem ProduktPage Templates welches bereits Eingang in die Zope Kern Distribution gefunden hat istParsed XML ein zusatzliches Produkt fur das auch das XML Paket fur Python pyXMLzusatzlich installiert werden muss Parsed XML stellt eine der W3C DOM Level 2 Spe-zifikation [Le 00] entsprechende Schnittstelle (DOM API) fur den Zugriff auf den XMLDOM Baum zur Verfugung Zusatzlich zu der vom W3C definierten DOM Level 2 APIwird in dem Parsed XML Produkt eine weitere API zur Verfugung gestellt die Manage-ableDOM API Diese Schnittstelle berucksichtigt mittels Proxy Objekten die zusatzlichenEigenschaften von Zope wie Management Publishing Traverseability und Security Ei-genschaften die in der W3C API nicht enthalten sind Diese Eigenschaften werden uberdie Python Klassen DOMManageable DOMPublishable DOMTraverseable und DOMIOerstellt und verwaltet Die DOM Level 2 API wird hier nicht vorgefuhrt da sie an anderenStellen in aller Ausfuhrlichkeit erwahnt wird [Le 00] In einer Zope Umgebung in der einwesentlicher Mehrwert auf die Zope Funktionalitaten wie Management Publizieren Tra-versabilitat und Sicherheit gelegt ist ist derzeit Parsed XML der einzig mogliche Weg umXML Dokumente zu parsen
61
Abbildung 2 Architektur des Beispiels
5 Beispiel Dynamische HTML Navigation aus XML Dokumenten
Als Beispiel fur die Anwendung der oben beschriebenen Produkte innerhalb von Zo-pe wird eine dynamische HTML Navigation aus XSD Slide Dokumenten zusammenge-stellt Die Architektur dazu ist in Abbildung 2 abgebildet Grundlage dieser dynamischeHTML Navigation bildet das XML Schema [Fal01] [Tho01] [Bir01] [Bai02] Dokumentslidesxsd (siehe Anhang A) mit dem zum Beispiel folgende XML Dokument Instanzverknupft werden kann
ltxml version=10 encoding=iso-8859-1gtltslide xmlns=httpwwwexamplecomslidesgtlttitlegtDer Titel des VortragslttitlegtltsubtitlegtDer Untertitel des VortragsltsubtitlegtltauthorgtDer Autor des VortragsltcompanygtDie Firma des Autorsltcompanygt
ltauthorgt
62
ltbodygtltslidegt
Werden nun entsprechende Parsed XML Dokumente in einem Ordered Folder abgelegt sobilden diese Dokumente die Menge aller Slides die uber das Page Templateslideshtml (siehe Anhang B) aufgerufen werden In diesem Page Template wird uberden Aufruf des Macros layout ein Default Template aus dem Page Template Dokumentlayouthtml (siehe Anhang C) vorgelegt und die entsprechenden Macro-Slotsnavigationpage header und main aus diesem Template werden durch die obigen fill-slot Be-reiche uberschrieben Das Default Page Template layouthtml ist dabei die HTMLVorlage die von einem HTML Designer als Grundlage fur ein Layout mit jedem HTMLEditor bearbeitet werden kann Der einzige Hinweis dass hier auch Logik eingebaut istsind die drei metalblock Elemente die entsprechende Slots definieren die von dem ei-gentlich aufgerufenen Page Template Dokument slideshtml uberschrieben werdenkonnen
Die Navigation wird dabei uber ein Python Skript geregelt welches eine simple Schleifeuber alle Parsed XML Objekte in dem Ordered Folder legt und die von dem derzeitigenObjekt sowohl das Vorganger Objekt als auch das Nachfolger Objekt berechnet
Die Umwandlung des XML Inhalts aus den Parsed XML Dokumenten erfolgt in demPython Skript xmlnode und wird uber das DOM Level 12 Interface Node und dessenAttribute nodeName nodeType childNodes und firstChild angesprochen
def xmlnode(node name)return the content of a slide document instanceaccording to the second argumentresult = for child in nodechildNodesif childnodeName == nameif len(childchildNodes) = 1if childnodeName == rsquobodyrsquofor i in childchildNodesresult = result + str(i)
return resultelif childnodeName == rsquoauthorrsquoresult = result + str(childfirstChild) + rsquonrsquofor i in childchildNodesif inodeName == rsquocompanyrsquoresult = result + str(ifirstChild)
return resultelif childfirstChildnodeType == nodeTEXT_NODEreturn str(childfirstChilddata)
else
63
return None
Als Beispiel kann die folgende Abbildung 3 eines Vortrags uber Online Graphics withSVG [Kle02] angesehen werden
Abbildung 3 HTML Slide erzeugt aus XML Schema Dokument mittels Parsed XML und PageTem-plates auf Zope
6 Ergebnis
Auch wenn der Open Source Web- und Application-Server Software Zope noch nicht alsreiner XML Webserver betitelt werden kann so ist eine Verarbeitung von XML Dokumen-ten mit einer XHTML Anzeige auch moglich ohne die geschlossene Umgebung von Zopezu verlassen Dafur sind jedoch noch die Zope Produkte (Programmpakete) Parsed XMLund Page Templates notwendig Parsed XML ist ein auf dem Python Expat aufbauenderXML Parser mit einer standardisierten DOM-Schnittstelle der die Eigenschaften von Zo-pe ubernimmt und als API anbietet Zusammen mit Page Templates einer auf Attributenbasierten Erweiterung von XHTML wird somit fur Zope die Basis zur XML Verarbeitungund XHTML Anzeige gelegt Mit dieser Methode XML Dokumente in Zope zu verar-beiten wird eine Moglichkeit geschaffen die Flexibilitat und Erweiterbarkeit von Zope
64
auch bei der XML-Verarbeitung auszunutzen Die vorgezeigte Methode wird mit einemBeispiel einer einfachen Anwendung fur eine dynamische HTML Navigation aus XMLDokumenten mit einer Struktur fur Slides dargestellt
Literatur
[Adl00] Adler etal Extensible Stylesheet Language httpwwww3orgTRxsl 2000
[Aye00] Ayeva et al Zope Book Project httpzdpzopeorgprojectszbook 2000
[Bai02] Baier etal XML Schema Teil 0 1 2 httpwwwedition-w3cde 2002
[Bee02] httpwwwbeehivede 2002
[Bir01] Biron etal XML Schema Part 2 Datatypes httpwwww3orgTRxmlschema-2 2001
[Bos98] Bos etal Cascading Style Sheets httpwwww3orgTRREC-CSS2 1998
[Bra98] Bray etal Extensible Markup Language httpwwww3orgTRREC-xml 1998
[CGI02] httphoohooncsauiuceducaiinterfacehtml 2002
[Faa02] Faassen Parsed XML httpwwwzopeorgmembersfassenParsedXML 2002
[Fal01] Fallside XML Schema Part 0 Primer httpwwww3orgTRxmlschema-0 2001
[Inf02] httpwwwinfraecom 2002
[Iuv02] httpwwwiuvenocom 2002
[Kle02] Klever Online Graphics with SVG httpxmlfh-augsburgdeSVGICL2002 2002
[Lat00] Latteier Pelletier The Zope Book httpwwwzopeorgdocumentation 2000
[LeH00] LeHors et al Document Object Model (DOM) Level 2 Core Specificationhttpwwww3orgTRDOM-Level-2-Core 2000
[Pem00] Pemberton et al XHTML 10 The Extensible HyperText Markup Languagehttpwwww3orgTR2000REC-xhtml1-20000126 2000
[Pro02] httpwwwzopeorgproductsall products 2002
[Tho01] Thompson etal XML Schema Part 1 Structures httpwwww3orgTRxmlschema-12001
[vR02] vRossum Drake Python Reference Manual httpwwwpythonorg 2002
65
Anhang A XML Schema Dokument slidesxsd
ltschema xmlnsxsd=httpwwww3org2001XMLSchemaxmlns=httpwwwexamplecomslidestargetNamespace=httpwwwexamplecomslideselementFormDefault=unqualifiedattributeFormDefault=unqualifiedgt
ltxsdelement name=slidegtltxsdcomplexTypegtltxsdsequencegtltxsdelement name=title type=xsdstringgtltxsdelement name=subtitle type=xsdstring
minOccurs=0gtltxsdelement name=author minOccurs=0gtltxsdcomplexType mixed=truegtltxsdsequencegtltxsdelement name=company type=xsdstring
minOccurs=0gtltxsdsequencegtltxsdcomplexTypegt
ltxsdelementgtltxsdelement name=body minOccurs=0gtltxsdcomplexType mixed=truegtltxsdsequencegtltxsdany namespace=httpwwww3org1999xhtml
minOccurs=0 maxOccurs=unboundedprocessContents=laxgt
ltxsdsequencegtltxsdanyAttribute
namespace=httpwwww3org1999xhtmlgtltxsdcomplexTypegt
ltxsdelementgtltxsdsequencegt
ltxsdcomplexTypegtltxsdelementgt
ltxsdschemagt
Anhang B Page Template Dokument slideshtml
ltxml version=10 encoding=iso-8859-1gtltDOCTYPE HTML PUBLIC
-W3CDTD HTML 401 TransitionalENhttpwwww3orgTRhtml4strictdtdgt
66
lthtml xmlns=httpwwww3org1999xhtml lang=enxmllang=enxmlnstal=httpxmlzopeorgnamespacestalxmlnsmetal=httpxmlzopeorgnamespacesmetaltaldefine=global thisSlideId requestslideglobal thisSlide pythongetattr(herethisSlideId)metaluse-macro=containerlayouthtmlmacroslayoutgt
ltheadgtltdiv metalfill-slot=style talomit-tag=gtltlink talcondition=python
modules[rsquostringrsquo]find(request[rsquoHTTP_USER_AGENTrsquo]rsquoGecko2002rsquo) = -1 rel=stylesheettype=textcsshref=standard_style_mozillacss gt
ltlink talcondition=pythonmodules[rsquostringrsquo]find(request[rsquoHTTP_USER_AGENTrsquo]rsquoWindowsrsquo) = -1 rel=stylesheet type=textcsshref=standard_style_windowscss gtltdivgt
ltheadgt
ltbodygtltdiv class=navigation metalfill-slot=navigation
taldefine=thisSlideId requestslidecurrent pythonstr(hereabsolute_url())+rsquoslides_htmlslide=rsquogt
lttd class=externgtlta href=prev talattributes=href
pythoncurrent+herenavigate(rsquoprevrsquothisSlideId)gtltimg src=prevpng alt=previous gtltagtlttdgt
lttd class=externgtlta href=top talattributes=href
pythoncurrent+herenavigate(rsquotoprsquothisSlideId)gtltimg src=toppng alt=top gtltagtlttdgt
lttd class=externgtlta href=next talattributes=href
pythoncurrent+herenavigate(rsquonextrsquothisSlideId)gtltimg src=nextpng alt=next gtltagtlttdgtltdivgt
ltdiv metalfill-slot=page_header talomit-tag=taldefine=thisSlideId requestslidethisSlide pythongetattr(herethisSlideId)gt
lth1 talcontent=pythonherexmlnode(thisSlidersquotitlersquo)gt
content titlelth1gt
67
lth2 talcondition=pythonherexmlnode(thisSlidersquosubtitlersquo)talcontent=pythonherexmlnode(thisSlidersquosubtitlersquo)talon-error=nothinggtoptional subtitlelth2gt
ltdivgtltdiv metalfill-slot=main class=margins
talomit-tag= taldefine=thisSlideId requestslidethisSlide pythongetattr(herethisSlideId)gt
ltspan class=titletalcondition=pythonthisSlideId==rsquoTitlersquogt
ltemgtltpre class=title
talcontent=pythonherexmlnode(thisSlidersquoauthorrsquo)
talon-error=nothinggtoptional authorltpregtltemgtltspangt
ltspan talcondition=pythonherexmlnode(thisSlidersquobodyrsquo)talreplace=structure
pythonherexmlnode(thisSlidersquobodyrsquo)talon-error=nothinggtoptional bodyltspangt
ltdivgtltbodygt
lthtmlgt
Anhang C Page Template Dokument layouthtml
ltxml version=10 encoding=iso-8859-1gtltDOCTYPE html PUBLIC -W3CDTD XHTML 11EN
httpwwww3orgTRxhtml11DTDxhtml11dtdgtlthtml xmlns=httpwwww3org1999xhtml
lang=de xmllang=dexmlnstal=httpxmlzopeorgnamespacestalxmlnsmetal=httpxmlzopeorgnamespacesmetalmetaldefine-macro=layoutgt
lthead metaldefine-slot=headgtltmeta http-equiv=Content-Type
content=texthtml charset=iso-8859-1 gtlttitlegtltspan talreplace=containertitlegtContext title
68
ltspangtltspan talcondition=containertitle
talreplace=string - gt - ltspangtltspan talreplace=heretitlegtThe titleltspangt
lttitlegtltlink metaldefine-slot=style rel=stylesheet
href=standard_style_netscapecsstype=textcss gt
ltheadgt
ltbodygtlttable class=externgtlttbodygtlttr class=externgtlttd class=externgtlta href=httpwwwfh-augsburgdegtltimg src=fha_logo alt=FH Augsburg gt
ltagtlttdgtlttd class=externgtlttdgt
lttrgtlttr valign=top class=externgtlttd class=externgtlttable class=externgtltcaptiongtltcaptiongtlttbodygtlttr class=navigationgtltmetalblock define-slot=navigationgtlttd class=navigationgtlta href=prevgt
ltimg src=prevpng alt=previous gtltagtlttdgt
lttd class= navigation gtlta href=topgt
ltimg src=toppng alt=top gtltagtlttdgt
lttd class= navigation gtlta href=nextgt
ltimg src=nextpng alt=next gtltagtlttdgt
ltmetalblockgtlttrgtlttbodygt
lttablegtlttdgtlttd class=page_headergt
69
ltmetalblock define-slot=page_headergtlth1gtpage titlelth1gtlth2gtand subtitle will be herelth2gt
ltmetalblockgtlttdgt
lttrgtlttr class=externgtlttd class=externgtlttdgtlttd class=maingtltmetalblock define-slot=maingtltulgtltligtmainltligtltligtinformationltligtltligtwillltligtltligtbe hereltligtltulgt
ltmetalblockgtlttdgt
lttrgtlttbodygt
lttablegtltbodygtlthtmlgt
70
Abbildung 1 Zope Architektur
xmlnsmetal=httpxmlzopeorgnamespacesmetal
verknupft Der Vorteil der Verwendung von Page Templates liegt dabei auf der Hand Jederbeliebige HTML Editor ist nun von Designern fur die Entwicklung des Internet-Layoutsverwendbar um die HTML Datei danach als Page Template als ein einziges Objekt einfachin Zope einbinden zu konnen Die Logik und Dynamik der entsprechenden Anwendungwird anschliessend mit den TAL- und METAL-Attributen eingebaut Weitere Entwick-lungszyklen sind ebenfalls unproblematisch da die zusatzlichen Attribute von den HTMLEditoren nicht interpretiert und verandert werden
31 Template Attribute Language
Die Template Attribute Language beruht im wesentlichen auf den Attributen content re-place und attributes welche Inhalte von Tags gesamte Tags und Attribute von Tags er-
59
setzen sowie den Attributen define condition und repeat welche Variablen definierenBedingungen abfragen und Schleifen abhandeln Als Beispiel sei hier die Ersetzung deshref-Attributes eines normalen XHTML Anchor Tags vorgefuhrt
lta href=samplelinkhtmltalattributes=href heresubabsolute_urlgt
In diesem Beispiel wird der vom Designer beispielhaft vorgegebene Link im href-Attributdurch einen Ausdruck heresubabsolute url ersetzt Dabei wurde das Schlussel-wort here verwendet welches sich auf den jeweiligen Context in der Zope-Objekthier-archie bezieht sub ist ein entsprechendes Objekt in diesem Context und absolute urleine Methode des Objektmanagers die an alle Objekte vererbt wird und die absolute URLdes entsprechenden Objektes zuruckliefert Ganz ahnlich wird in dem folgenden Beispielder Inhalt des XHTML Paragraph Tags ersetzt
ltp talcontent=structure heregetStorygtmarked ltbgtupltbgt content goes here
ltpgt
Hier wird der Inhalt dieses Tags also marked ltbgtupltbgt content goes hereersetzt durch das Ergebnis welches die Methode getStory aus dem aktuellen Contexthere zuruckliefert Dabei wird die Struktur des Inhalts durch das Schlusselwortstructure beibehalten was bedeutet dass entsprechende XHTML oder XML-Tagsinterpretiert werden und nicht als XML-Entities umschrieben werden Bei der Verwen-dung der Attribute repeat und condition die den Ablauf beeinflussen sehen die Beispielefolgendermassen aus
lttr talrepeat=item pythonrange(10)gtlttd bgcolor=000000
talcondition=repeatitemeventalattributes=bgcolor stringrsquoDCDCDCrsquotalcontent=repeatitemnumbergtEven Numberlttdgt
lttd bgcolor=000000talcondition=repeatitemoddtalattributes=bgcolor stringrsquo000000rsquotalcontent=repeatitemnumbergtOdd Numberlttdgt
lttrgt
In diesem Beispiel werden 10 Zeilen mit einer Spalte erzeugt die jeweils abwechslendgrau fur die geraden Zahlen und weiss fur die ungeraden Zahlen unterlegt sind rangeist dabei eine interne Python Funktion und repeat ein Schlusselwort welches sich auf dasRepeat-Objekt bezieht von dem die Methoden even odd und number fur jeden Schleifen-durchlauf item geerbt werden
60
32 Macro Extension Template Attribute Language
Die Macro Extension Template Attribute Language wird dazu verwendet um immer wie-der auftauchende Ablaufe und Ausdrucke umfangreicherer Art zu definieren und wieder-zuverwenden Hierfur sind die vier Attribute define-macro use-macro define-slot und fill-slot geschaffen worden Als Beispiel sei hier ein einfaches Copyright vorgefuhrt
ltp metaldefine-macro=copyrightgtCopyright 2001ltemgtFoo Bar and Associatesltemgt Inc
ltpgt
Der Aufruf dieses Macros lautet dann folgendermassen
ltb metalusemacro=containermaster_pagemacroscopyrightgt
Macro goes hereltbgt
wobei das Bold-Tag komplett durch das Paragraph-Tag ersetzt wird Die beiden anderenAttribute konnen zusatzlich dazu verwendet werden um slots innerhalb von Macros zudefinieren die dann noch zusatzlich uberschrieben werden konnen
4 Parsed XML
Die Verarbeitung von XML Dokumenten benotigt einen entsprechenden XML Parser Esliegt in einer einheitlichen Umgebung auf der Hand den Vorgang des Parsens durch ei-ne entsprechend integrierte Schnittstelle herzustellen Im Zope Produkt Parsed XML[Faa02] wird diese Schnittstelle zur Verfugung gestellt Im Gegensatz zu dem ProduktPage Templates welches bereits Eingang in die Zope Kern Distribution gefunden hat istParsed XML ein zusatzliches Produkt fur das auch das XML Paket fur Python pyXMLzusatzlich installiert werden muss Parsed XML stellt eine der W3C DOM Level 2 Spe-zifikation [Le 00] entsprechende Schnittstelle (DOM API) fur den Zugriff auf den XMLDOM Baum zur Verfugung Zusatzlich zu der vom W3C definierten DOM Level 2 APIwird in dem Parsed XML Produkt eine weitere API zur Verfugung gestellt die Manage-ableDOM API Diese Schnittstelle berucksichtigt mittels Proxy Objekten die zusatzlichenEigenschaften von Zope wie Management Publishing Traverseability und Security Ei-genschaften die in der W3C API nicht enthalten sind Diese Eigenschaften werden uberdie Python Klassen DOMManageable DOMPublishable DOMTraverseable und DOMIOerstellt und verwaltet Die DOM Level 2 API wird hier nicht vorgefuhrt da sie an anderenStellen in aller Ausfuhrlichkeit erwahnt wird [Le 00] In einer Zope Umgebung in der einwesentlicher Mehrwert auf die Zope Funktionalitaten wie Management Publizieren Tra-versabilitat und Sicherheit gelegt ist ist derzeit Parsed XML der einzig mogliche Weg umXML Dokumente zu parsen
61
Abbildung 2 Architektur des Beispiels
5 Beispiel Dynamische HTML Navigation aus XML Dokumenten
Als Beispiel fur die Anwendung der oben beschriebenen Produkte innerhalb von Zo-pe wird eine dynamische HTML Navigation aus XSD Slide Dokumenten zusammenge-stellt Die Architektur dazu ist in Abbildung 2 abgebildet Grundlage dieser dynamischeHTML Navigation bildet das XML Schema [Fal01] [Tho01] [Bir01] [Bai02] Dokumentslidesxsd (siehe Anhang A) mit dem zum Beispiel folgende XML Dokument Instanzverknupft werden kann
ltxml version=10 encoding=iso-8859-1gtltslide xmlns=httpwwwexamplecomslidesgtlttitlegtDer Titel des VortragslttitlegtltsubtitlegtDer Untertitel des VortragsltsubtitlegtltauthorgtDer Autor des VortragsltcompanygtDie Firma des Autorsltcompanygt
ltauthorgt
62
ltbodygtltslidegt
Werden nun entsprechende Parsed XML Dokumente in einem Ordered Folder abgelegt sobilden diese Dokumente die Menge aller Slides die uber das Page Templateslideshtml (siehe Anhang B) aufgerufen werden In diesem Page Template wird uberden Aufruf des Macros layout ein Default Template aus dem Page Template Dokumentlayouthtml (siehe Anhang C) vorgelegt und die entsprechenden Macro-Slotsnavigationpage header und main aus diesem Template werden durch die obigen fill-slot Be-reiche uberschrieben Das Default Page Template layouthtml ist dabei die HTMLVorlage die von einem HTML Designer als Grundlage fur ein Layout mit jedem HTMLEditor bearbeitet werden kann Der einzige Hinweis dass hier auch Logik eingebaut istsind die drei metalblock Elemente die entsprechende Slots definieren die von dem ei-gentlich aufgerufenen Page Template Dokument slideshtml uberschrieben werdenkonnen
Die Navigation wird dabei uber ein Python Skript geregelt welches eine simple Schleifeuber alle Parsed XML Objekte in dem Ordered Folder legt und die von dem derzeitigenObjekt sowohl das Vorganger Objekt als auch das Nachfolger Objekt berechnet
Die Umwandlung des XML Inhalts aus den Parsed XML Dokumenten erfolgt in demPython Skript xmlnode und wird uber das DOM Level 12 Interface Node und dessenAttribute nodeName nodeType childNodes und firstChild angesprochen
def xmlnode(node name)return the content of a slide document instanceaccording to the second argumentresult = for child in nodechildNodesif childnodeName == nameif len(childchildNodes) = 1if childnodeName == rsquobodyrsquofor i in childchildNodesresult = result + str(i)
return resultelif childnodeName == rsquoauthorrsquoresult = result + str(childfirstChild) + rsquonrsquofor i in childchildNodesif inodeName == rsquocompanyrsquoresult = result + str(ifirstChild)
return resultelif childfirstChildnodeType == nodeTEXT_NODEreturn str(childfirstChilddata)
else
63
return None
Als Beispiel kann die folgende Abbildung 3 eines Vortrags uber Online Graphics withSVG [Kle02] angesehen werden
Abbildung 3 HTML Slide erzeugt aus XML Schema Dokument mittels Parsed XML und PageTem-plates auf Zope
6 Ergebnis
Auch wenn der Open Source Web- und Application-Server Software Zope noch nicht alsreiner XML Webserver betitelt werden kann so ist eine Verarbeitung von XML Dokumen-ten mit einer XHTML Anzeige auch moglich ohne die geschlossene Umgebung von Zopezu verlassen Dafur sind jedoch noch die Zope Produkte (Programmpakete) Parsed XMLund Page Templates notwendig Parsed XML ist ein auf dem Python Expat aufbauenderXML Parser mit einer standardisierten DOM-Schnittstelle der die Eigenschaften von Zo-pe ubernimmt und als API anbietet Zusammen mit Page Templates einer auf Attributenbasierten Erweiterung von XHTML wird somit fur Zope die Basis zur XML Verarbeitungund XHTML Anzeige gelegt Mit dieser Methode XML Dokumente in Zope zu verar-beiten wird eine Moglichkeit geschaffen die Flexibilitat und Erweiterbarkeit von Zope
64
auch bei der XML-Verarbeitung auszunutzen Die vorgezeigte Methode wird mit einemBeispiel einer einfachen Anwendung fur eine dynamische HTML Navigation aus XMLDokumenten mit einer Struktur fur Slides dargestellt
Literatur
[Adl00] Adler etal Extensible Stylesheet Language httpwwww3orgTRxsl 2000
[Aye00] Ayeva et al Zope Book Project httpzdpzopeorgprojectszbook 2000
[Bai02] Baier etal XML Schema Teil 0 1 2 httpwwwedition-w3cde 2002
[Bee02] httpwwwbeehivede 2002
[Bir01] Biron etal XML Schema Part 2 Datatypes httpwwww3orgTRxmlschema-2 2001
[Bos98] Bos etal Cascading Style Sheets httpwwww3orgTRREC-CSS2 1998
[Bra98] Bray etal Extensible Markup Language httpwwww3orgTRREC-xml 1998
[CGI02] httphoohooncsauiuceducaiinterfacehtml 2002
[Faa02] Faassen Parsed XML httpwwwzopeorgmembersfassenParsedXML 2002
[Fal01] Fallside XML Schema Part 0 Primer httpwwww3orgTRxmlschema-0 2001
[Inf02] httpwwwinfraecom 2002
[Iuv02] httpwwwiuvenocom 2002
[Kle02] Klever Online Graphics with SVG httpxmlfh-augsburgdeSVGICL2002 2002
[Lat00] Latteier Pelletier The Zope Book httpwwwzopeorgdocumentation 2000
[LeH00] LeHors et al Document Object Model (DOM) Level 2 Core Specificationhttpwwww3orgTRDOM-Level-2-Core 2000
[Pem00] Pemberton et al XHTML 10 The Extensible HyperText Markup Languagehttpwwww3orgTR2000REC-xhtml1-20000126 2000
[Pro02] httpwwwzopeorgproductsall products 2002
[Tho01] Thompson etal XML Schema Part 1 Structures httpwwww3orgTRxmlschema-12001
[vR02] vRossum Drake Python Reference Manual httpwwwpythonorg 2002
65
Anhang A XML Schema Dokument slidesxsd
ltschema xmlnsxsd=httpwwww3org2001XMLSchemaxmlns=httpwwwexamplecomslidestargetNamespace=httpwwwexamplecomslideselementFormDefault=unqualifiedattributeFormDefault=unqualifiedgt
ltxsdelement name=slidegtltxsdcomplexTypegtltxsdsequencegtltxsdelement name=title type=xsdstringgtltxsdelement name=subtitle type=xsdstring
minOccurs=0gtltxsdelement name=author minOccurs=0gtltxsdcomplexType mixed=truegtltxsdsequencegtltxsdelement name=company type=xsdstring
minOccurs=0gtltxsdsequencegtltxsdcomplexTypegt
ltxsdelementgtltxsdelement name=body minOccurs=0gtltxsdcomplexType mixed=truegtltxsdsequencegtltxsdany namespace=httpwwww3org1999xhtml
minOccurs=0 maxOccurs=unboundedprocessContents=laxgt
ltxsdsequencegtltxsdanyAttribute
namespace=httpwwww3org1999xhtmlgtltxsdcomplexTypegt
ltxsdelementgtltxsdsequencegt
ltxsdcomplexTypegtltxsdelementgt
ltxsdschemagt
Anhang B Page Template Dokument slideshtml
ltxml version=10 encoding=iso-8859-1gtltDOCTYPE HTML PUBLIC
-W3CDTD HTML 401 TransitionalENhttpwwww3orgTRhtml4strictdtdgt
66
lthtml xmlns=httpwwww3org1999xhtml lang=enxmllang=enxmlnstal=httpxmlzopeorgnamespacestalxmlnsmetal=httpxmlzopeorgnamespacesmetaltaldefine=global thisSlideId requestslideglobal thisSlide pythongetattr(herethisSlideId)metaluse-macro=containerlayouthtmlmacroslayoutgt
ltheadgtltdiv metalfill-slot=style talomit-tag=gtltlink talcondition=python
modules[rsquostringrsquo]find(request[rsquoHTTP_USER_AGENTrsquo]rsquoGecko2002rsquo) = -1 rel=stylesheettype=textcsshref=standard_style_mozillacss gt
ltlink talcondition=pythonmodules[rsquostringrsquo]find(request[rsquoHTTP_USER_AGENTrsquo]rsquoWindowsrsquo) = -1 rel=stylesheet type=textcsshref=standard_style_windowscss gtltdivgt
ltheadgt
ltbodygtltdiv class=navigation metalfill-slot=navigation
taldefine=thisSlideId requestslidecurrent pythonstr(hereabsolute_url())+rsquoslides_htmlslide=rsquogt
lttd class=externgtlta href=prev talattributes=href
pythoncurrent+herenavigate(rsquoprevrsquothisSlideId)gtltimg src=prevpng alt=previous gtltagtlttdgt
lttd class=externgtlta href=top talattributes=href
pythoncurrent+herenavigate(rsquotoprsquothisSlideId)gtltimg src=toppng alt=top gtltagtlttdgt
lttd class=externgtlta href=next talattributes=href
pythoncurrent+herenavigate(rsquonextrsquothisSlideId)gtltimg src=nextpng alt=next gtltagtlttdgtltdivgt
ltdiv metalfill-slot=page_header talomit-tag=taldefine=thisSlideId requestslidethisSlide pythongetattr(herethisSlideId)gt
lth1 talcontent=pythonherexmlnode(thisSlidersquotitlersquo)gt
content titlelth1gt
67
lth2 talcondition=pythonherexmlnode(thisSlidersquosubtitlersquo)talcontent=pythonherexmlnode(thisSlidersquosubtitlersquo)talon-error=nothinggtoptional subtitlelth2gt
ltdivgtltdiv metalfill-slot=main class=margins
talomit-tag= taldefine=thisSlideId requestslidethisSlide pythongetattr(herethisSlideId)gt
ltspan class=titletalcondition=pythonthisSlideId==rsquoTitlersquogt
ltemgtltpre class=title
talcontent=pythonherexmlnode(thisSlidersquoauthorrsquo)
talon-error=nothinggtoptional authorltpregtltemgtltspangt
ltspan talcondition=pythonherexmlnode(thisSlidersquobodyrsquo)talreplace=structure
pythonherexmlnode(thisSlidersquobodyrsquo)talon-error=nothinggtoptional bodyltspangt
ltdivgtltbodygt
lthtmlgt
Anhang C Page Template Dokument layouthtml
ltxml version=10 encoding=iso-8859-1gtltDOCTYPE html PUBLIC -W3CDTD XHTML 11EN
httpwwww3orgTRxhtml11DTDxhtml11dtdgtlthtml xmlns=httpwwww3org1999xhtml
lang=de xmllang=dexmlnstal=httpxmlzopeorgnamespacestalxmlnsmetal=httpxmlzopeorgnamespacesmetalmetaldefine-macro=layoutgt
lthead metaldefine-slot=headgtltmeta http-equiv=Content-Type
content=texthtml charset=iso-8859-1 gtlttitlegtltspan talreplace=containertitlegtContext title
68
ltspangtltspan talcondition=containertitle
talreplace=string - gt - ltspangtltspan talreplace=heretitlegtThe titleltspangt
lttitlegtltlink metaldefine-slot=style rel=stylesheet
href=standard_style_netscapecsstype=textcss gt
ltheadgt
ltbodygtlttable class=externgtlttbodygtlttr class=externgtlttd class=externgtlta href=httpwwwfh-augsburgdegtltimg src=fha_logo alt=FH Augsburg gt
ltagtlttdgtlttd class=externgtlttdgt
lttrgtlttr valign=top class=externgtlttd class=externgtlttable class=externgtltcaptiongtltcaptiongtlttbodygtlttr class=navigationgtltmetalblock define-slot=navigationgtlttd class=navigationgtlta href=prevgt
ltimg src=prevpng alt=previous gtltagtlttdgt
lttd class= navigation gtlta href=topgt
ltimg src=toppng alt=top gtltagtlttdgt
lttd class= navigation gtlta href=nextgt
ltimg src=nextpng alt=next gtltagtlttdgt
ltmetalblockgtlttrgtlttbodygt
lttablegtlttdgtlttd class=page_headergt
69
ltmetalblock define-slot=page_headergtlth1gtpage titlelth1gtlth2gtand subtitle will be herelth2gt
ltmetalblockgtlttdgt
lttrgtlttr class=externgtlttd class=externgtlttdgtlttd class=maingtltmetalblock define-slot=maingtltulgtltligtmainltligtltligtinformationltligtltligtwillltligtltligtbe hereltligtltulgt
ltmetalblockgtlttdgt
lttrgtlttbodygt
lttablegtltbodygtlthtmlgt
70
setzen sowie den Attributen define condition und repeat welche Variablen definierenBedingungen abfragen und Schleifen abhandeln Als Beispiel sei hier die Ersetzung deshref-Attributes eines normalen XHTML Anchor Tags vorgefuhrt
lta href=samplelinkhtmltalattributes=href heresubabsolute_urlgt
In diesem Beispiel wird der vom Designer beispielhaft vorgegebene Link im href-Attributdurch einen Ausdruck heresubabsolute url ersetzt Dabei wurde das Schlussel-wort here verwendet welches sich auf den jeweiligen Context in der Zope-Objekthier-archie bezieht sub ist ein entsprechendes Objekt in diesem Context und absolute urleine Methode des Objektmanagers die an alle Objekte vererbt wird und die absolute URLdes entsprechenden Objektes zuruckliefert Ganz ahnlich wird in dem folgenden Beispielder Inhalt des XHTML Paragraph Tags ersetzt
ltp talcontent=structure heregetStorygtmarked ltbgtupltbgt content goes here
ltpgt
Hier wird der Inhalt dieses Tags also marked ltbgtupltbgt content goes hereersetzt durch das Ergebnis welches die Methode getStory aus dem aktuellen Contexthere zuruckliefert Dabei wird die Struktur des Inhalts durch das Schlusselwortstructure beibehalten was bedeutet dass entsprechende XHTML oder XML-Tagsinterpretiert werden und nicht als XML-Entities umschrieben werden Bei der Verwen-dung der Attribute repeat und condition die den Ablauf beeinflussen sehen die Beispielefolgendermassen aus
lttr talrepeat=item pythonrange(10)gtlttd bgcolor=000000
talcondition=repeatitemeventalattributes=bgcolor stringrsquoDCDCDCrsquotalcontent=repeatitemnumbergtEven Numberlttdgt
lttd bgcolor=000000talcondition=repeatitemoddtalattributes=bgcolor stringrsquo000000rsquotalcontent=repeatitemnumbergtOdd Numberlttdgt
lttrgt
In diesem Beispiel werden 10 Zeilen mit einer Spalte erzeugt die jeweils abwechslendgrau fur die geraden Zahlen und weiss fur die ungeraden Zahlen unterlegt sind rangeist dabei eine interne Python Funktion und repeat ein Schlusselwort welches sich auf dasRepeat-Objekt bezieht von dem die Methoden even odd und number fur jeden Schleifen-durchlauf item geerbt werden
60
32 Macro Extension Template Attribute Language
Die Macro Extension Template Attribute Language wird dazu verwendet um immer wie-der auftauchende Ablaufe und Ausdrucke umfangreicherer Art zu definieren und wieder-zuverwenden Hierfur sind die vier Attribute define-macro use-macro define-slot und fill-slot geschaffen worden Als Beispiel sei hier ein einfaches Copyright vorgefuhrt
ltp metaldefine-macro=copyrightgtCopyright 2001ltemgtFoo Bar and Associatesltemgt Inc
ltpgt
Der Aufruf dieses Macros lautet dann folgendermassen
ltb metalusemacro=containermaster_pagemacroscopyrightgt
Macro goes hereltbgt
wobei das Bold-Tag komplett durch das Paragraph-Tag ersetzt wird Die beiden anderenAttribute konnen zusatzlich dazu verwendet werden um slots innerhalb von Macros zudefinieren die dann noch zusatzlich uberschrieben werden konnen
4 Parsed XML
Die Verarbeitung von XML Dokumenten benotigt einen entsprechenden XML Parser Esliegt in einer einheitlichen Umgebung auf der Hand den Vorgang des Parsens durch ei-ne entsprechend integrierte Schnittstelle herzustellen Im Zope Produkt Parsed XML[Faa02] wird diese Schnittstelle zur Verfugung gestellt Im Gegensatz zu dem ProduktPage Templates welches bereits Eingang in die Zope Kern Distribution gefunden hat istParsed XML ein zusatzliches Produkt fur das auch das XML Paket fur Python pyXMLzusatzlich installiert werden muss Parsed XML stellt eine der W3C DOM Level 2 Spe-zifikation [Le 00] entsprechende Schnittstelle (DOM API) fur den Zugriff auf den XMLDOM Baum zur Verfugung Zusatzlich zu der vom W3C definierten DOM Level 2 APIwird in dem Parsed XML Produkt eine weitere API zur Verfugung gestellt die Manage-ableDOM API Diese Schnittstelle berucksichtigt mittels Proxy Objekten die zusatzlichenEigenschaften von Zope wie Management Publishing Traverseability und Security Ei-genschaften die in der W3C API nicht enthalten sind Diese Eigenschaften werden uberdie Python Klassen DOMManageable DOMPublishable DOMTraverseable und DOMIOerstellt und verwaltet Die DOM Level 2 API wird hier nicht vorgefuhrt da sie an anderenStellen in aller Ausfuhrlichkeit erwahnt wird [Le 00] In einer Zope Umgebung in der einwesentlicher Mehrwert auf die Zope Funktionalitaten wie Management Publizieren Tra-versabilitat und Sicherheit gelegt ist ist derzeit Parsed XML der einzig mogliche Weg umXML Dokumente zu parsen
61
Abbildung 2 Architektur des Beispiels
5 Beispiel Dynamische HTML Navigation aus XML Dokumenten
Als Beispiel fur die Anwendung der oben beschriebenen Produkte innerhalb von Zo-pe wird eine dynamische HTML Navigation aus XSD Slide Dokumenten zusammenge-stellt Die Architektur dazu ist in Abbildung 2 abgebildet Grundlage dieser dynamischeHTML Navigation bildet das XML Schema [Fal01] [Tho01] [Bir01] [Bai02] Dokumentslidesxsd (siehe Anhang A) mit dem zum Beispiel folgende XML Dokument Instanzverknupft werden kann
ltxml version=10 encoding=iso-8859-1gtltslide xmlns=httpwwwexamplecomslidesgtlttitlegtDer Titel des VortragslttitlegtltsubtitlegtDer Untertitel des VortragsltsubtitlegtltauthorgtDer Autor des VortragsltcompanygtDie Firma des Autorsltcompanygt
ltauthorgt
62
ltbodygtltslidegt
Werden nun entsprechende Parsed XML Dokumente in einem Ordered Folder abgelegt sobilden diese Dokumente die Menge aller Slides die uber das Page Templateslideshtml (siehe Anhang B) aufgerufen werden In diesem Page Template wird uberden Aufruf des Macros layout ein Default Template aus dem Page Template Dokumentlayouthtml (siehe Anhang C) vorgelegt und die entsprechenden Macro-Slotsnavigationpage header und main aus diesem Template werden durch die obigen fill-slot Be-reiche uberschrieben Das Default Page Template layouthtml ist dabei die HTMLVorlage die von einem HTML Designer als Grundlage fur ein Layout mit jedem HTMLEditor bearbeitet werden kann Der einzige Hinweis dass hier auch Logik eingebaut istsind die drei metalblock Elemente die entsprechende Slots definieren die von dem ei-gentlich aufgerufenen Page Template Dokument slideshtml uberschrieben werdenkonnen
Die Navigation wird dabei uber ein Python Skript geregelt welches eine simple Schleifeuber alle Parsed XML Objekte in dem Ordered Folder legt und die von dem derzeitigenObjekt sowohl das Vorganger Objekt als auch das Nachfolger Objekt berechnet
Die Umwandlung des XML Inhalts aus den Parsed XML Dokumenten erfolgt in demPython Skript xmlnode und wird uber das DOM Level 12 Interface Node und dessenAttribute nodeName nodeType childNodes und firstChild angesprochen
def xmlnode(node name)return the content of a slide document instanceaccording to the second argumentresult = for child in nodechildNodesif childnodeName == nameif len(childchildNodes) = 1if childnodeName == rsquobodyrsquofor i in childchildNodesresult = result + str(i)
return resultelif childnodeName == rsquoauthorrsquoresult = result + str(childfirstChild) + rsquonrsquofor i in childchildNodesif inodeName == rsquocompanyrsquoresult = result + str(ifirstChild)
return resultelif childfirstChildnodeType == nodeTEXT_NODEreturn str(childfirstChilddata)
else
63
return None
Als Beispiel kann die folgende Abbildung 3 eines Vortrags uber Online Graphics withSVG [Kle02] angesehen werden
Abbildung 3 HTML Slide erzeugt aus XML Schema Dokument mittels Parsed XML und PageTem-plates auf Zope
6 Ergebnis
Auch wenn der Open Source Web- und Application-Server Software Zope noch nicht alsreiner XML Webserver betitelt werden kann so ist eine Verarbeitung von XML Dokumen-ten mit einer XHTML Anzeige auch moglich ohne die geschlossene Umgebung von Zopezu verlassen Dafur sind jedoch noch die Zope Produkte (Programmpakete) Parsed XMLund Page Templates notwendig Parsed XML ist ein auf dem Python Expat aufbauenderXML Parser mit einer standardisierten DOM-Schnittstelle der die Eigenschaften von Zo-pe ubernimmt und als API anbietet Zusammen mit Page Templates einer auf Attributenbasierten Erweiterung von XHTML wird somit fur Zope die Basis zur XML Verarbeitungund XHTML Anzeige gelegt Mit dieser Methode XML Dokumente in Zope zu verar-beiten wird eine Moglichkeit geschaffen die Flexibilitat und Erweiterbarkeit von Zope
64
auch bei der XML-Verarbeitung auszunutzen Die vorgezeigte Methode wird mit einemBeispiel einer einfachen Anwendung fur eine dynamische HTML Navigation aus XMLDokumenten mit einer Struktur fur Slides dargestellt
Literatur
[Adl00] Adler etal Extensible Stylesheet Language httpwwww3orgTRxsl 2000
[Aye00] Ayeva et al Zope Book Project httpzdpzopeorgprojectszbook 2000
[Bai02] Baier etal XML Schema Teil 0 1 2 httpwwwedition-w3cde 2002
[Bee02] httpwwwbeehivede 2002
[Bir01] Biron etal XML Schema Part 2 Datatypes httpwwww3orgTRxmlschema-2 2001
[Bos98] Bos etal Cascading Style Sheets httpwwww3orgTRREC-CSS2 1998
[Bra98] Bray etal Extensible Markup Language httpwwww3orgTRREC-xml 1998
[CGI02] httphoohooncsauiuceducaiinterfacehtml 2002
[Faa02] Faassen Parsed XML httpwwwzopeorgmembersfassenParsedXML 2002
[Fal01] Fallside XML Schema Part 0 Primer httpwwww3orgTRxmlschema-0 2001
[Inf02] httpwwwinfraecom 2002
[Iuv02] httpwwwiuvenocom 2002
[Kle02] Klever Online Graphics with SVG httpxmlfh-augsburgdeSVGICL2002 2002
[Lat00] Latteier Pelletier The Zope Book httpwwwzopeorgdocumentation 2000
[LeH00] LeHors et al Document Object Model (DOM) Level 2 Core Specificationhttpwwww3orgTRDOM-Level-2-Core 2000
[Pem00] Pemberton et al XHTML 10 The Extensible HyperText Markup Languagehttpwwww3orgTR2000REC-xhtml1-20000126 2000
[Pro02] httpwwwzopeorgproductsall products 2002
[Tho01] Thompson etal XML Schema Part 1 Structures httpwwww3orgTRxmlschema-12001
[vR02] vRossum Drake Python Reference Manual httpwwwpythonorg 2002
65
Anhang A XML Schema Dokument slidesxsd
ltschema xmlnsxsd=httpwwww3org2001XMLSchemaxmlns=httpwwwexamplecomslidestargetNamespace=httpwwwexamplecomslideselementFormDefault=unqualifiedattributeFormDefault=unqualifiedgt
ltxsdelement name=slidegtltxsdcomplexTypegtltxsdsequencegtltxsdelement name=title type=xsdstringgtltxsdelement name=subtitle type=xsdstring
minOccurs=0gtltxsdelement name=author minOccurs=0gtltxsdcomplexType mixed=truegtltxsdsequencegtltxsdelement name=company type=xsdstring
minOccurs=0gtltxsdsequencegtltxsdcomplexTypegt
ltxsdelementgtltxsdelement name=body minOccurs=0gtltxsdcomplexType mixed=truegtltxsdsequencegtltxsdany namespace=httpwwww3org1999xhtml
minOccurs=0 maxOccurs=unboundedprocessContents=laxgt
ltxsdsequencegtltxsdanyAttribute
namespace=httpwwww3org1999xhtmlgtltxsdcomplexTypegt
ltxsdelementgtltxsdsequencegt
ltxsdcomplexTypegtltxsdelementgt
ltxsdschemagt
Anhang B Page Template Dokument slideshtml
ltxml version=10 encoding=iso-8859-1gtltDOCTYPE HTML PUBLIC
-W3CDTD HTML 401 TransitionalENhttpwwww3orgTRhtml4strictdtdgt
66
lthtml xmlns=httpwwww3org1999xhtml lang=enxmllang=enxmlnstal=httpxmlzopeorgnamespacestalxmlnsmetal=httpxmlzopeorgnamespacesmetaltaldefine=global thisSlideId requestslideglobal thisSlide pythongetattr(herethisSlideId)metaluse-macro=containerlayouthtmlmacroslayoutgt
ltheadgtltdiv metalfill-slot=style talomit-tag=gtltlink talcondition=python
modules[rsquostringrsquo]find(request[rsquoHTTP_USER_AGENTrsquo]rsquoGecko2002rsquo) = -1 rel=stylesheettype=textcsshref=standard_style_mozillacss gt
ltlink talcondition=pythonmodules[rsquostringrsquo]find(request[rsquoHTTP_USER_AGENTrsquo]rsquoWindowsrsquo) = -1 rel=stylesheet type=textcsshref=standard_style_windowscss gtltdivgt
ltheadgt
ltbodygtltdiv class=navigation metalfill-slot=navigation
taldefine=thisSlideId requestslidecurrent pythonstr(hereabsolute_url())+rsquoslides_htmlslide=rsquogt
lttd class=externgtlta href=prev talattributes=href
pythoncurrent+herenavigate(rsquoprevrsquothisSlideId)gtltimg src=prevpng alt=previous gtltagtlttdgt
lttd class=externgtlta href=top talattributes=href
pythoncurrent+herenavigate(rsquotoprsquothisSlideId)gtltimg src=toppng alt=top gtltagtlttdgt
lttd class=externgtlta href=next talattributes=href
pythoncurrent+herenavigate(rsquonextrsquothisSlideId)gtltimg src=nextpng alt=next gtltagtlttdgtltdivgt
ltdiv metalfill-slot=page_header talomit-tag=taldefine=thisSlideId requestslidethisSlide pythongetattr(herethisSlideId)gt
lth1 talcontent=pythonherexmlnode(thisSlidersquotitlersquo)gt
content titlelth1gt
67
lth2 talcondition=pythonherexmlnode(thisSlidersquosubtitlersquo)talcontent=pythonherexmlnode(thisSlidersquosubtitlersquo)talon-error=nothinggtoptional subtitlelth2gt
ltdivgtltdiv metalfill-slot=main class=margins
talomit-tag= taldefine=thisSlideId requestslidethisSlide pythongetattr(herethisSlideId)gt
ltspan class=titletalcondition=pythonthisSlideId==rsquoTitlersquogt
ltemgtltpre class=title
talcontent=pythonherexmlnode(thisSlidersquoauthorrsquo)
talon-error=nothinggtoptional authorltpregtltemgtltspangt
ltspan talcondition=pythonherexmlnode(thisSlidersquobodyrsquo)talreplace=structure
pythonherexmlnode(thisSlidersquobodyrsquo)talon-error=nothinggtoptional bodyltspangt
ltdivgtltbodygt
lthtmlgt
Anhang C Page Template Dokument layouthtml
ltxml version=10 encoding=iso-8859-1gtltDOCTYPE html PUBLIC -W3CDTD XHTML 11EN
httpwwww3orgTRxhtml11DTDxhtml11dtdgtlthtml xmlns=httpwwww3org1999xhtml
lang=de xmllang=dexmlnstal=httpxmlzopeorgnamespacestalxmlnsmetal=httpxmlzopeorgnamespacesmetalmetaldefine-macro=layoutgt
lthead metaldefine-slot=headgtltmeta http-equiv=Content-Type
content=texthtml charset=iso-8859-1 gtlttitlegtltspan talreplace=containertitlegtContext title
68
ltspangtltspan talcondition=containertitle
talreplace=string - gt - ltspangtltspan talreplace=heretitlegtThe titleltspangt
lttitlegtltlink metaldefine-slot=style rel=stylesheet
href=standard_style_netscapecsstype=textcss gt
ltheadgt
ltbodygtlttable class=externgtlttbodygtlttr class=externgtlttd class=externgtlta href=httpwwwfh-augsburgdegtltimg src=fha_logo alt=FH Augsburg gt
ltagtlttdgtlttd class=externgtlttdgt
lttrgtlttr valign=top class=externgtlttd class=externgtlttable class=externgtltcaptiongtltcaptiongtlttbodygtlttr class=navigationgtltmetalblock define-slot=navigationgtlttd class=navigationgtlta href=prevgt
ltimg src=prevpng alt=previous gtltagtlttdgt
lttd class= navigation gtlta href=topgt
ltimg src=toppng alt=top gtltagtlttdgt
lttd class= navigation gtlta href=nextgt
ltimg src=nextpng alt=next gtltagtlttdgt
ltmetalblockgtlttrgtlttbodygt
lttablegtlttdgtlttd class=page_headergt
69
ltmetalblock define-slot=page_headergtlth1gtpage titlelth1gtlth2gtand subtitle will be herelth2gt
ltmetalblockgtlttdgt
lttrgtlttr class=externgtlttd class=externgtlttdgtlttd class=maingtltmetalblock define-slot=maingtltulgtltligtmainltligtltligtinformationltligtltligtwillltligtltligtbe hereltligtltulgt
ltmetalblockgtlttdgt
lttrgtlttbodygt
lttablegtltbodygtlthtmlgt
70
32 Macro Extension Template Attribute Language
Die Macro Extension Template Attribute Language wird dazu verwendet um immer wie-der auftauchende Ablaufe und Ausdrucke umfangreicherer Art zu definieren und wieder-zuverwenden Hierfur sind die vier Attribute define-macro use-macro define-slot und fill-slot geschaffen worden Als Beispiel sei hier ein einfaches Copyright vorgefuhrt
ltp metaldefine-macro=copyrightgtCopyright 2001ltemgtFoo Bar and Associatesltemgt Inc
ltpgt
Der Aufruf dieses Macros lautet dann folgendermassen
ltb metalusemacro=containermaster_pagemacroscopyrightgt
Macro goes hereltbgt
wobei das Bold-Tag komplett durch das Paragraph-Tag ersetzt wird Die beiden anderenAttribute konnen zusatzlich dazu verwendet werden um slots innerhalb von Macros zudefinieren die dann noch zusatzlich uberschrieben werden konnen
4 Parsed XML
Die Verarbeitung von XML Dokumenten benotigt einen entsprechenden XML Parser Esliegt in einer einheitlichen Umgebung auf der Hand den Vorgang des Parsens durch ei-ne entsprechend integrierte Schnittstelle herzustellen Im Zope Produkt Parsed XML[Faa02] wird diese Schnittstelle zur Verfugung gestellt Im Gegensatz zu dem ProduktPage Templates welches bereits Eingang in die Zope Kern Distribution gefunden hat istParsed XML ein zusatzliches Produkt fur das auch das XML Paket fur Python pyXMLzusatzlich installiert werden muss Parsed XML stellt eine der W3C DOM Level 2 Spe-zifikation [Le 00] entsprechende Schnittstelle (DOM API) fur den Zugriff auf den XMLDOM Baum zur Verfugung Zusatzlich zu der vom W3C definierten DOM Level 2 APIwird in dem Parsed XML Produkt eine weitere API zur Verfugung gestellt die Manage-ableDOM API Diese Schnittstelle berucksichtigt mittels Proxy Objekten die zusatzlichenEigenschaften von Zope wie Management Publishing Traverseability und Security Ei-genschaften die in der W3C API nicht enthalten sind Diese Eigenschaften werden uberdie Python Klassen DOMManageable DOMPublishable DOMTraverseable und DOMIOerstellt und verwaltet Die DOM Level 2 API wird hier nicht vorgefuhrt da sie an anderenStellen in aller Ausfuhrlichkeit erwahnt wird [Le 00] In einer Zope Umgebung in der einwesentlicher Mehrwert auf die Zope Funktionalitaten wie Management Publizieren Tra-versabilitat und Sicherheit gelegt ist ist derzeit Parsed XML der einzig mogliche Weg umXML Dokumente zu parsen
61
Abbildung 2 Architektur des Beispiels
5 Beispiel Dynamische HTML Navigation aus XML Dokumenten
Als Beispiel fur die Anwendung der oben beschriebenen Produkte innerhalb von Zo-pe wird eine dynamische HTML Navigation aus XSD Slide Dokumenten zusammenge-stellt Die Architektur dazu ist in Abbildung 2 abgebildet Grundlage dieser dynamischeHTML Navigation bildet das XML Schema [Fal01] [Tho01] [Bir01] [Bai02] Dokumentslidesxsd (siehe Anhang A) mit dem zum Beispiel folgende XML Dokument Instanzverknupft werden kann
ltxml version=10 encoding=iso-8859-1gtltslide xmlns=httpwwwexamplecomslidesgtlttitlegtDer Titel des VortragslttitlegtltsubtitlegtDer Untertitel des VortragsltsubtitlegtltauthorgtDer Autor des VortragsltcompanygtDie Firma des Autorsltcompanygt
ltauthorgt
62
ltbodygtltslidegt
Werden nun entsprechende Parsed XML Dokumente in einem Ordered Folder abgelegt sobilden diese Dokumente die Menge aller Slides die uber das Page Templateslideshtml (siehe Anhang B) aufgerufen werden In diesem Page Template wird uberden Aufruf des Macros layout ein Default Template aus dem Page Template Dokumentlayouthtml (siehe Anhang C) vorgelegt und die entsprechenden Macro-Slotsnavigationpage header und main aus diesem Template werden durch die obigen fill-slot Be-reiche uberschrieben Das Default Page Template layouthtml ist dabei die HTMLVorlage die von einem HTML Designer als Grundlage fur ein Layout mit jedem HTMLEditor bearbeitet werden kann Der einzige Hinweis dass hier auch Logik eingebaut istsind die drei metalblock Elemente die entsprechende Slots definieren die von dem ei-gentlich aufgerufenen Page Template Dokument slideshtml uberschrieben werdenkonnen
Die Navigation wird dabei uber ein Python Skript geregelt welches eine simple Schleifeuber alle Parsed XML Objekte in dem Ordered Folder legt und die von dem derzeitigenObjekt sowohl das Vorganger Objekt als auch das Nachfolger Objekt berechnet
Die Umwandlung des XML Inhalts aus den Parsed XML Dokumenten erfolgt in demPython Skript xmlnode und wird uber das DOM Level 12 Interface Node und dessenAttribute nodeName nodeType childNodes und firstChild angesprochen
def xmlnode(node name)return the content of a slide document instanceaccording to the second argumentresult = for child in nodechildNodesif childnodeName == nameif len(childchildNodes) = 1if childnodeName == rsquobodyrsquofor i in childchildNodesresult = result + str(i)
return resultelif childnodeName == rsquoauthorrsquoresult = result + str(childfirstChild) + rsquonrsquofor i in childchildNodesif inodeName == rsquocompanyrsquoresult = result + str(ifirstChild)
return resultelif childfirstChildnodeType == nodeTEXT_NODEreturn str(childfirstChilddata)
else
63
return None
Als Beispiel kann die folgende Abbildung 3 eines Vortrags uber Online Graphics withSVG [Kle02] angesehen werden
Abbildung 3 HTML Slide erzeugt aus XML Schema Dokument mittels Parsed XML und PageTem-plates auf Zope
6 Ergebnis
Auch wenn der Open Source Web- und Application-Server Software Zope noch nicht alsreiner XML Webserver betitelt werden kann so ist eine Verarbeitung von XML Dokumen-ten mit einer XHTML Anzeige auch moglich ohne die geschlossene Umgebung von Zopezu verlassen Dafur sind jedoch noch die Zope Produkte (Programmpakete) Parsed XMLund Page Templates notwendig Parsed XML ist ein auf dem Python Expat aufbauenderXML Parser mit einer standardisierten DOM-Schnittstelle der die Eigenschaften von Zo-pe ubernimmt und als API anbietet Zusammen mit Page Templates einer auf Attributenbasierten Erweiterung von XHTML wird somit fur Zope die Basis zur XML Verarbeitungund XHTML Anzeige gelegt Mit dieser Methode XML Dokumente in Zope zu verar-beiten wird eine Moglichkeit geschaffen die Flexibilitat und Erweiterbarkeit von Zope
64
auch bei der XML-Verarbeitung auszunutzen Die vorgezeigte Methode wird mit einemBeispiel einer einfachen Anwendung fur eine dynamische HTML Navigation aus XMLDokumenten mit einer Struktur fur Slides dargestellt
Literatur
[Adl00] Adler etal Extensible Stylesheet Language httpwwww3orgTRxsl 2000
[Aye00] Ayeva et al Zope Book Project httpzdpzopeorgprojectszbook 2000
[Bai02] Baier etal XML Schema Teil 0 1 2 httpwwwedition-w3cde 2002
[Bee02] httpwwwbeehivede 2002
[Bir01] Biron etal XML Schema Part 2 Datatypes httpwwww3orgTRxmlschema-2 2001
[Bos98] Bos etal Cascading Style Sheets httpwwww3orgTRREC-CSS2 1998
[Bra98] Bray etal Extensible Markup Language httpwwww3orgTRREC-xml 1998
[CGI02] httphoohooncsauiuceducaiinterfacehtml 2002
[Faa02] Faassen Parsed XML httpwwwzopeorgmembersfassenParsedXML 2002
[Fal01] Fallside XML Schema Part 0 Primer httpwwww3orgTRxmlschema-0 2001
[Inf02] httpwwwinfraecom 2002
[Iuv02] httpwwwiuvenocom 2002
[Kle02] Klever Online Graphics with SVG httpxmlfh-augsburgdeSVGICL2002 2002
[Lat00] Latteier Pelletier The Zope Book httpwwwzopeorgdocumentation 2000
[LeH00] LeHors et al Document Object Model (DOM) Level 2 Core Specificationhttpwwww3orgTRDOM-Level-2-Core 2000
[Pem00] Pemberton et al XHTML 10 The Extensible HyperText Markup Languagehttpwwww3orgTR2000REC-xhtml1-20000126 2000
[Pro02] httpwwwzopeorgproductsall products 2002
[Tho01] Thompson etal XML Schema Part 1 Structures httpwwww3orgTRxmlschema-12001
[vR02] vRossum Drake Python Reference Manual httpwwwpythonorg 2002
65
Anhang A XML Schema Dokument slidesxsd
ltschema xmlnsxsd=httpwwww3org2001XMLSchemaxmlns=httpwwwexamplecomslidestargetNamespace=httpwwwexamplecomslideselementFormDefault=unqualifiedattributeFormDefault=unqualifiedgt
ltxsdelement name=slidegtltxsdcomplexTypegtltxsdsequencegtltxsdelement name=title type=xsdstringgtltxsdelement name=subtitle type=xsdstring
minOccurs=0gtltxsdelement name=author minOccurs=0gtltxsdcomplexType mixed=truegtltxsdsequencegtltxsdelement name=company type=xsdstring
minOccurs=0gtltxsdsequencegtltxsdcomplexTypegt
ltxsdelementgtltxsdelement name=body minOccurs=0gtltxsdcomplexType mixed=truegtltxsdsequencegtltxsdany namespace=httpwwww3org1999xhtml
minOccurs=0 maxOccurs=unboundedprocessContents=laxgt
ltxsdsequencegtltxsdanyAttribute
namespace=httpwwww3org1999xhtmlgtltxsdcomplexTypegt
ltxsdelementgtltxsdsequencegt
ltxsdcomplexTypegtltxsdelementgt
ltxsdschemagt
Anhang B Page Template Dokument slideshtml
ltxml version=10 encoding=iso-8859-1gtltDOCTYPE HTML PUBLIC
-W3CDTD HTML 401 TransitionalENhttpwwww3orgTRhtml4strictdtdgt
66
lthtml xmlns=httpwwww3org1999xhtml lang=enxmllang=enxmlnstal=httpxmlzopeorgnamespacestalxmlnsmetal=httpxmlzopeorgnamespacesmetaltaldefine=global thisSlideId requestslideglobal thisSlide pythongetattr(herethisSlideId)metaluse-macro=containerlayouthtmlmacroslayoutgt
ltheadgtltdiv metalfill-slot=style talomit-tag=gtltlink talcondition=python
modules[rsquostringrsquo]find(request[rsquoHTTP_USER_AGENTrsquo]rsquoGecko2002rsquo) = -1 rel=stylesheettype=textcsshref=standard_style_mozillacss gt
ltlink talcondition=pythonmodules[rsquostringrsquo]find(request[rsquoHTTP_USER_AGENTrsquo]rsquoWindowsrsquo) = -1 rel=stylesheet type=textcsshref=standard_style_windowscss gtltdivgt
ltheadgt
ltbodygtltdiv class=navigation metalfill-slot=navigation
taldefine=thisSlideId requestslidecurrent pythonstr(hereabsolute_url())+rsquoslides_htmlslide=rsquogt
lttd class=externgtlta href=prev talattributes=href
pythoncurrent+herenavigate(rsquoprevrsquothisSlideId)gtltimg src=prevpng alt=previous gtltagtlttdgt
lttd class=externgtlta href=top talattributes=href
pythoncurrent+herenavigate(rsquotoprsquothisSlideId)gtltimg src=toppng alt=top gtltagtlttdgt
lttd class=externgtlta href=next talattributes=href
pythoncurrent+herenavigate(rsquonextrsquothisSlideId)gtltimg src=nextpng alt=next gtltagtlttdgtltdivgt
ltdiv metalfill-slot=page_header talomit-tag=taldefine=thisSlideId requestslidethisSlide pythongetattr(herethisSlideId)gt
lth1 talcontent=pythonherexmlnode(thisSlidersquotitlersquo)gt
content titlelth1gt
67
lth2 talcondition=pythonherexmlnode(thisSlidersquosubtitlersquo)talcontent=pythonherexmlnode(thisSlidersquosubtitlersquo)talon-error=nothinggtoptional subtitlelth2gt
ltdivgtltdiv metalfill-slot=main class=margins
talomit-tag= taldefine=thisSlideId requestslidethisSlide pythongetattr(herethisSlideId)gt
ltspan class=titletalcondition=pythonthisSlideId==rsquoTitlersquogt
ltemgtltpre class=title
talcontent=pythonherexmlnode(thisSlidersquoauthorrsquo)
talon-error=nothinggtoptional authorltpregtltemgtltspangt
ltspan talcondition=pythonherexmlnode(thisSlidersquobodyrsquo)talreplace=structure
pythonherexmlnode(thisSlidersquobodyrsquo)talon-error=nothinggtoptional bodyltspangt
ltdivgtltbodygt
lthtmlgt
Anhang C Page Template Dokument layouthtml
ltxml version=10 encoding=iso-8859-1gtltDOCTYPE html PUBLIC -W3CDTD XHTML 11EN
httpwwww3orgTRxhtml11DTDxhtml11dtdgtlthtml xmlns=httpwwww3org1999xhtml
lang=de xmllang=dexmlnstal=httpxmlzopeorgnamespacestalxmlnsmetal=httpxmlzopeorgnamespacesmetalmetaldefine-macro=layoutgt
lthead metaldefine-slot=headgtltmeta http-equiv=Content-Type
content=texthtml charset=iso-8859-1 gtlttitlegtltspan talreplace=containertitlegtContext title
68
ltspangtltspan talcondition=containertitle
talreplace=string - gt - ltspangtltspan talreplace=heretitlegtThe titleltspangt
lttitlegtltlink metaldefine-slot=style rel=stylesheet
href=standard_style_netscapecsstype=textcss gt
ltheadgt
ltbodygtlttable class=externgtlttbodygtlttr class=externgtlttd class=externgtlta href=httpwwwfh-augsburgdegtltimg src=fha_logo alt=FH Augsburg gt
ltagtlttdgtlttd class=externgtlttdgt
lttrgtlttr valign=top class=externgtlttd class=externgtlttable class=externgtltcaptiongtltcaptiongtlttbodygtlttr class=navigationgtltmetalblock define-slot=navigationgtlttd class=navigationgtlta href=prevgt
ltimg src=prevpng alt=previous gtltagtlttdgt
lttd class= navigation gtlta href=topgt
ltimg src=toppng alt=top gtltagtlttdgt
lttd class= navigation gtlta href=nextgt
ltimg src=nextpng alt=next gtltagtlttdgt
ltmetalblockgtlttrgtlttbodygt
lttablegtlttdgtlttd class=page_headergt
69
ltmetalblock define-slot=page_headergtlth1gtpage titlelth1gtlth2gtand subtitle will be herelth2gt
ltmetalblockgtlttdgt
lttrgtlttr class=externgtlttd class=externgtlttdgtlttd class=maingtltmetalblock define-slot=maingtltulgtltligtmainltligtltligtinformationltligtltligtwillltligtltligtbe hereltligtltulgt
ltmetalblockgtlttdgt
lttrgtlttbodygt
lttablegtltbodygtlthtmlgt
70
Abbildung 2 Architektur des Beispiels
5 Beispiel Dynamische HTML Navigation aus XML Dokumenten
Als Beispiel fur die Anwendung der oben beschriebenen Produkte innerhalb von Zo-pe wird eine dynamische HTML Navigation aus XSD Slide Dokumenten zusammenge-stellt Die Architektur dazu ist in Abbildung 2 abgebildet Grundlage dieser dynamischeHTML Navigation bildet das XML Schema [Fal01] [Tho01] [Bir01] [Bai02] Dokumentslidesxsd (siehe Anhang A) mit dem zum Beispiel folgende XML Dokument Instanzverknupft werden kann
ltxml version=10 encoding=iso-8859-1gtltslide xmlns=httpwwwexamplecomslidesgtlttitlegtDer Titel des VortragslttitlegtltsubtitlegtDer Untertitel des VortragsltsubtitlegtltauthorgtDer Autor des VortragsltcompanygtDie Firma des Autorsltcompanygt
ltauthorgt
62
ltbodygtltslidegt
Werden nun entsprechende Parsed XML Dokumente in einem Ordered Folder abgelegt sobilden diese Dokumente die Menge aller Slides die uber das Page Templateslideshtml (siehe Anhang B) aufgerufen werden In diesem Page Template wird uberden Aufruf des Macros layout ein Default Template aus dem Page Template Dokumentlayouthtml (siehe Anhang C) vorgelegt und die entsprechenden Macro-Slotsnavigationpage header und main aus diesem Template werden durch die obigen fill-slot Be-reiche uberschrieben Das Default Page Template layouthtml ist dabei die HTMLVorlage die von einem HTML Designer als Grundlage fur ein Layout mit jedem HTMLEditor bearbeitet werden kann Der einzige Hinweis dass hier auch Logik eingebaut istsind die drei metalblock Elemente die entsprechende Slots definieren die von dem ei-gentlich aufgerufenen Page Template Dokument slideshtml uberschrieben werdenkonnen
Die Navigation wird dabei uber ein Python Skript geregelt welches eine simple Schleifeuber alle Parsed XML Objekte in dem Ordered Folder legt und die von dem derzeitigenObjekt sowohl das Vorganger Objekt als auch das Nachfolger Objekt berechnet
Die Umwandlung des XML Inhalts aus den Parsed XML Dokumenten erfolgt in demPython Skript xmlnode und wird uber das DOM Level 12 Interface Node und dessenAttribute nodeName nodeType childNodes und firstChild angesprochen
def xmlnode(node name)return the content of a slide document instanceaccording to the second argumentresult = for child in nodechildNodesif childnodeName == nameif len(childchildNodes) = 1if childnodeName == rsquobodyrsquofor i in childchildNodesresult = result + str(i)
return resultelif childnodeName == rsquoauthorrsquoresult = result + str(childfirstChild) + rsquonrsquofor i in childchildNodesif inodeName == rsquocompanyrsquoresult = result + str(ifirstChild)
return resultelif childfirstChildnodeType == nodeTEXT_NODEreturn str(childfirstChilddata)
else
63
return None
Als Beispiel kann die folgende Abbildung 3 eines Vortrags uber Online Graphics withSVG [Kle02] angesehen werden
Abbildung 3 HTML Slide erzeugt aus XML Schema Dokument mittels Parsed XML und PageTem-plates auf Zope
6 Ergebnis
Auch wenn der Open Source Web- und Application-Server Software Zope noch nicht alsreiner XML Webserver betitelt werden kann so ist eine Verarbeitung von XML Dokumen-ten mit einer XHTML Anzeige auch moglich ohne die geschlossene Umgebung von Zopezu verlassen Dafur sind jedoch noch die Zope Produkte (Programmpakete) Parsed XMLund Page Templates notwendig Parsed XML ist ein auf dem Python Expat aufbauenderXML Parser mit einer standardisierten DOM-Schnittstelle der die Eigenschaften von Zo-pe ubernimmt und als API anbietet Zusammen mit Page Templates einer auf Attributenbasierten Erweiterung von XHTML wird somit fur Zope die Basis zur XML Verarbeitungund XHTML Anzeige gelegt Mit dieser Methode XML Dokumente in Zope zu verar-beiten wird eine Moglichkeit geschaffen die Flexibilitat und Erweiterbarkeit von Zope
64
auch bei der XML-Verarbeitung auszunutzen Die vorgezeigte Methode wird mit einemBeispiel einer einfachen Anwendung fur eine dynamische HTML Navigation aus XMLDokumenten mit einer Struktur fur Slides dargestellt
Literatur
[Adl00] Adler etal Extensible Stylesheet Language httpwwww3orgTRxsl 2000
[Aye00] Ayeva et al Zope Book Project httpzdpzopeorgprojectszbook 2000
[Bai02] Baier etal XML Schema Teil 0 1 2 httpwwwedition-w3cde 2002
[Bee02] httpwwwbeehivede 2002
[Bir01] Biron etal XML Schema Part 2 Datatypes httpwwww3orgTRxmlschema-2 2001
[Bos98] Bos etal Cascading Style Sheets httpwwww3orgTRREC-CSS2 1998
[Bra98] Bray etal Extensible Markup Language httpwwww3orgTRREC-xml 1998
[CGI02] httphoohooncsauiuceducaiinterfacehtml 2002
[Faa02] Faassen Parsed XML httpwwwzopeorgmembersfassenParsedXML 2002
[Fal01] Fallside XML Schema Part 0 Primer httpwwww3orgTRxmlschema-0 2001
[Inf02] httpwwwinfraecom 2002
[Iuv02] httpwwwiuvenocom 2002
[Kle02] Klever Online Graphics with SVG httpxmlfh-augsburgdeSVGICL2002 2002
[Lat00] Latteier Pelletier The Zope Book httpwwwzopeorgdocumentation 2000
[LeH00] LeHors et al Document Object Model (DOM) Level 2 Core Specificationhttpwwww3orgTRDOM-Level-2-Core 2000
[Pem00] Pemberton et al XHTML 10 The Extensible HyperText Markup Languagehttpwwww3orgTR2000REC-xhtml1-20000126 2000
[Pro02] httpwwwzopeorgproductsall products 2002
[Tho01] Thompson etal XML Schema Part 1 Structures httpwwww3orgTRxmlschema-12001
[vR02] vRossum Drake Python Reference Manual httpwwwpythonorg 2002
65
Anhang A XML Schema Dokument slidesxsd
ltschema xmlnsxsd=httpwwww3org2001XMLSchemaxmlns=httpwwwexamplecomslidestargetNamespace=httpwwwexamplecomslideselementFormDefault=unqualifiedattributeFormDefault=unqualifiedgt
ltxsdelement name=slidegtltxsdcomplexTypegtltxsdsequencegtltxsdelement name=title type=xsdstringgtltxsdelement name=subtitle type=xsdstring
minOccurs=0gtltxsdelement name=author minOccurs=0gtltxsdcomplexType mixed=truegtltxsdsequencegtltxsdelement name=company type=xsdstring
minOccurs=0gtltxsdsequencegtltxsdcomplexTypegt
ltxsdelementgtltxsdelement name=body minOccurs=0gtltxsdcomplexType mixed=truegtltxsdsequencegtltxsdany namespace=httpwwww3org1999xhtml
minOccurs=0 maxOccurs=unboundedprocessContents=laxgt
ltxsdsequencegtltxsdanyAttribute
namespace=httpwwww3org1999xhtmlgtltxsdcomplexTypegt
ltxsdelementgtltxsdsequencegt
ltxsdcomplexTypegtltxsdelementgt
ltxsdschemagt
Anhang B Page Template Dokument slideshtml
ltxml version=10 encoding=iso-8859-1gtltDOCTYPE HTML PUBLIC
-W3CDTD HTML 401 TransitionalENhttpwwww3orgTRhtml4strictdtdgt
66
lthtml xmlns=httpwwww3org1999xhtml lang=enxmllang=enxmlnstal=httpxmlzopeorgnamespacestalxmlnsmetal=httpxmlzopeorgnamespacesmetaltaldefine=global thisSlideId requestslideglobal thisSlide pythongetattr(herethisSlideId)metaluse-macro=containerlayouthtmlmacroslayoutgt
ltheadgtltdiv metalfill-slot=style talomit-tag=gtltlink talcondition=python
modules[rsquostringrsquo]find(request[rsquoHTTP_USER_AGENTrsquo]rsquoGecko2002rsquo) = -1 rel=stylesheettype=textcsshref=standard_style_mozillacss gt
ltlink talcondition=pythonmodules[rsquostringrsquo]find(request[rsquoHTTP_USER_AGENTrsquo]rsquoWindowsrsquo) = -1 rel=stylesheet type=textcsshref=standard_style_windowscss gtltdivgt
ltheadgt
ltbodygtltdiv class=navigation metalfill-slot=navigation
taldefine=thisSlideId requestslidecurrent pythonstr(hereabsolute_url())+rsquoslides_htmlslide=rsquogt
lttd class=externgtlta href=prev talattributes=href
pythoncurrent+herenavigate(rsquoprevrsquothisSlideId)gtltimg src=prevpng alt=previous gtltagtlttdgt
lttd class=externgtlta href=top talattributes=href
pythoncurrent+herenavigate(rsquotoprsquothisSlideId)gtltimg src=toppng alt=top gtltagtlttdgt
lttd class=externgtlta href=next talattributes=href
pythoncurrent+herenavigate(rsquonextrsquothisSlideId)gtltimg src=nextpng alt=next gtltagtlttdgtltdivgt
ltdiv metalfill-slot=page_header talomit-tag=taldefine=thisSlideId requestslidethisSlide pythongetattr(herethisSlideId)gt
lth1 talcontent=pythonherexmlnode(thisSlidersquotitlersquo)gt
content titlelth1gt
67
lth2 talcondition=pythonherexmlnode(thisSlidersquosubtitlersquo)talcontent=pythonherexmlnode(thisSlidersquosubtitlersquo)talon-error=nothinggtoptional subtitlelth2gt
ltdivgtltdiv metalfill-slot=main class=margins
talomit-tag= taldefine=thisSlideId requestslidethisSlide pythongetattr(herethisSlideId)gt
ltspan class=titletalcondition=pythonthisSlideId==rsquoTitlersquogt
ltemgtltpre class=title
talcontent=pythonherexmlnode(thisSlidersquoauthorrsquo)
talon-error=nothinggtoptional authorltpregtltemgtltspangt
ltspan talcondition=pythonherexmlnode(thisSlidersquobodyrsquo)talreplace=structure
pythonherexmlnode(thisSlidersquobodyrsquo)talon-error=nothinggtoptional bodyltspangt
ltdivgtltbodygt
lthtmlgt
Anhang C Page Template Dokument layouthtml
ltxml version=10 encoding=iso-8859-1gtltDOCTYPE html PUBLIC -W3CDTD XHTML 11EN
httpwwww3orgTRxhtml11DTDxhtml11dtdgtlthtml xmlns=httpwwww3org1999xhtml
lang=de xmllang=dexmlnstal=httpxmlzopeorgnamespacestalxmlnsmetal=httpxmlzopeorgnamespacesmetalmetaldefine-macro=layoutgt
lthead metaldefine-slot=headgtltmeta http-equiv=Content-Type
content=texthtml charset=iso-8859-1 gtlttitlegtltspan talreplace=containertitlegtContext title
68
ltspangtltspan talcondition=containertitle
talreplace=string - gt - ltspangtltspan talreplace=heretitlegtThe titleltspangt
lttitlegtltlink metaldefine-slot=style rel=stylesheet
href=standard_style_netscapecsstype=textcss gt
ltheadgt
ltbodygtlttable class=externgtlttbodygtlttr class=externgtlttd class=externgtlta href=httpwwwfh-augsburgdegtltimg src=fha_logo alt=FH Augsburg gt
ltagtlttdgtlttd class=externgtlttdgt
lttrgtlttr valign=top class=externgtlttd class=externgtlttable class=externgtltcaptiongtltcaptiongtlttbodygtlttr class=navigationgtltmetalblock define-slot=navigationgtlttd class=navigationgtlta href=prevgt
ltimg src=prevpng alt=previous gtltagtlttdgt
lttd class= navigation gtlta href=topgt
ltimg src=toppng alt=top gtltagtlttdgt
lttd class= navigation gtlta href=nextgt
ltimg src=nextpng alt=next gtltagtlttdgt
ltmetalblockgtlttrgtlttbodygt
lttablegtlttdgtlttd class=page_headergt
69
ltmetalblock define-slot=page_headergtlth1gtpage titlelth1gtlth2gtand subtitle will be herelth2gt
ltmetalblockgtlttdgt
lttrgtlttr class=externgtlttd class=externgtlttdgtlttd class=maingtltmetalblock define-slot=maingtltulgtltligtmainltligtltligtinformationltligtltligtwillltligtltligtbe hereltligtltulgt
ltmetalblockgtlttdgt
lttrgtlttbodygt
lttablegtltbodygtlthtmlgt
70
ltbodygtltslidegt
Werden nun entsprechende Parsed XML Dokumente in einem Ordered Folder abgelegt sobilden diese Dokumente die Menge aller Slides die uber das Page Templateslideshtml (siehe Anhang B) aufgerufen werden In diesem Page Template wird uberden Aufruf des Macros layout ein Default Template aus dem Page Template Dokumentlayouthtml (siehe Anhang C) vorgelegt und die entsprechenden Macro-Slotsnavigationpage header und main aus diesem Template werden durch die obigen fill-slot Be-reiche uberschrieben Das Default Page Template layouthtml ist dabei die HTMLVorlage die von einem HTML Designer als Grundlage fur ein Layout mit jedem HTMLEditor bearbeitet werden kann Der einzige Hinweis dass hier auch Logik eingebaut istsind die drei metalblock Elemente die entsprechende Slots definieren die von dem ei-gentlich aufgerufenen Page Template Dokument slideshtml uberschrieben werdenkonnen
Die Navigation wird dabei uber ein Python Skript geregelt welches eine simple Schleifeuber alle Parsed XML Objekte in dem Ordered Folder legt und die von dem derzeitigenObjekt sowohl das Vorganger Objekt als auch das Nachfolger Objekt berechnet
Die Umwandlung des XML Inhalts aus den Parsed XML Dokumenten erfolgt in demPython Skript xmlnode und wird uber das DOM Level 12 Interface Node und dessenAttribute nodeName nodeType childNodes und firstChild angesprochen
def xmlnode(node name)return the content of a slide document instanceaccording to the second argumentresult = for child in nodechildNodesif childnodeName == nameif len(childchildNodes) = 1if childnodeName == rsquobodyrsquofor i in childchildNodesresult = result + str(i)
return resultelif childnodeName == rsquoauthorrsquoresult = result + str(childfirstChild) + rsquonrsquofor i in childchildNodesif inodeName == rsquocompanyrsquoresult = result + str(ifirstChild)
return resultelif childfirstChildnodeType == nodeTEXT_NODEreturn str(childfirstChilddata)
else
63
return None
Als Beispiel kann die folgende Abbildung 3 eines Vortrags uber Online Graphics withSVG [Kle02] angesehen werden
Abbildung 3 HTML Slide erzeugt aus XML Schema Dokument mittels Parsed XML und PageTem-plates auf Zope
6 Ergebnis
Auch wenn der Open Source Web- und Application-Server Software Zope noch nicht alsreiner XML Webserver betitelt werden kann so ist eine Verarbeitung von XML Dokumen-ten mit einer XHTML Anzeige auch moglich ohne die geschlossene Umgebung von Zopezu verlassen Dafur sind jedoch noch die Zope Produkte (Programmpakete) Parsed XMLund Page Templates notwendig Parsed XML ist ein auf dem Python Expat aufbauenderXML Parser mit einer standardisierten DOM-Schnittstelle der die Eigenschaften von Zo-pe ubernimmt und als API anbietet Zusammen mit Page Templates einer auf Attributenbasierten Erweiterung von XHTML wird somit fur Zope die Basis zur XML Verarbeitungund XHTML Anzeige gelegt Mit dieser Methode XML Dokumente in Zope zu verar-beiten wird eine Moglichkeit geschaffen die Flexibilitat und Erweiterbarkeit von Zope
64
auch bei der XML-Verarbeitung auszunutzen Die vorgezeigte Methode wird mit einemBeispiel einer einfachen Anwendung fur eine dynamische HTML Navigation aus XMLDokumenten mit einer Struktur fur Slides dargestellt
Literatur
[Adl00] Adler etal Extensible Stylesheet Language httpwwww3orgTRxsl 2000
[Aye00] Ayeva et al Zope Book Project httpzdpzopeorgprojectszbook 2000
[Bai02] Baier etal XML Schema Teil 0 1 2 httpwwwedition-w3cde 2002
[Bee02] httpwwwbeehivede 2002
[Bir01] Biron etal XML Schema Part 2 Datatypes httpwwww3orgTRxmlschema-2 2001
[Bos98] Bos etal Cascading Style Sheets httpwwww3orgTRREC-CSS2 1998
[Bra98] Bray etal Extensible Markup Language httpwwww3orgTRREC-xml 1998
[CGI02] httphoohooncsauiuceducaiinterfacehtml 2002
[Faa02] Faassen Parsed XML httpwwwzopeorgmembersfassenParsedXML 2002
[Fal01] Fallside XML Schema Part 0 Primer httpwwww3orgTRxmlschema-0 2001
[Inf02] httpwwwinfraecom 2002
[Iuv02] httpwwwiuvenocom 2002
[Kle02] Klever Online Graphics with SVG httpxmlfh-augsburgdeSVGICL2002 2002
[Lat00] Latteier Pelletier The Zope Book httpwwwzopeorgdocumentation 2000
[LeH00] LeHors et al Document Object Model (DOM) Level 2 Core Specificationhttpwwww3orgTRDOM-Level-2-Core 2000
[Pem00] Pemberton et al XHTML 10 The Extensible HyperText Markup Languagehttpwwww3orgTR2000REC-xhtml1-20000126 2000
[Pro02] httpwwwzopeorgproductsall products 2002
[Tho01] Thompson etal XML Schema Part 1 Structures httpwwww3orgTRxmlschema-12001
[vR02] vRossum Drake Python Reference Manual httpwwwpythonorg 2002
65
Anhang A XML Schema Dokument slidesxsd
ltschema xmlnsxsd=httpwwww3org2001XMLSchemaxmlns=httpwwwexamplecomslidestargetNamespace=httpwwwexamplecomslideselementFormDefault=unqualifiedattributeFormDefault=unqualifiedgt
ltxsdelement name=slidegtltxsdcomplexTypegtltxsdsequencegtltxsdelement name=title type=xsdstringgtltxsdelement name=subtitle type=xsdstring
minOccurs=0gtltxsdelement name=author minOccurs=0gtltxsdcomplexType mixed=truegtltxsdsequencegtltxsdelement name=company type=xsdstring
minOccurs=0gtltxsdsequencegtltxsdcomplexTypegt
ltxsdelementgtltxsdelement name=body minOccurs=0gtltxsdcomplexType mixed=truegtltxsdsequencegtltxsdany namespace=httpwwww3org1999xhtml
minOccurs=0 maxOccurs=unboundedprocessContents=laxgt
ltxsdsequencegtltxsdanyAttribute
namespace=httpwwww3org1999xhtmlgtltxsdcomplexTypegt
ltxsdelementgtltxsdsequencegt
ltxsdcomplexTypegtltxsdelementgt
ltxsdschemagt
Anhang B Page Template Dokument slideshtml
ltxml version=10 encoding=iso-8859-1gtltDOCTYPE HTML PUBLIC
-W3CDTD HTML 401 TransitionalENhttpwwww3orgTRhtml4strictdtdgt
66
lthtml xmlns=httpwwww3org1999xhtml lang=enxmllang=enxmlnstal=httpxmlzopeorgnamespacestalxmlnsmetal=httpxmlzopeorgnamespacesmetaltaldefine=global thisSlideId requestslideglobal thisSlide pythongetattr(herethisSlideId)metaluse-macro=containerlayouthtmlmacroslayoutgt
ltheadgtltdiv metalfill-slot=style talomit-tag=gtltlink talcondition=python
modules[rsquostringrsquo]find(request[rsquoHTTP_USER_AGENTrsquo]rsquoGecko2002rsquo) = -1 rel=stylesheettype=textcsshref=standard_style_mozillacss gt
ltlink talcondition=pythonmodules[rsquostringrsquo]find(request[rsquoHTTP_USER_AGENTrsquo]rsquoWindowsrsquo) = -1 rel=stylesheet type=textcsshref=standard_style_windowscss gtltdivgt
ltheadgt
ltbodygtltdiv class=navigation metalfill-slot=navigation
taldefine=thisSlideId requestslidecurrent pythonstr(hereabsolute_url())+rsquoslides_htmlslide=rsquogt
lttd class=externgtlta href=prev talattributes=href
pythoncurrent+herenavigate(rsquoprevrsquothisSlideId)gtltimg src=prevpng alt=previous gtltagtlttdgt
lttd class=externgtlta href=top talattributes=href
pythoncurrent+herenavigate(rsquotoprsquothisSlideId)gtltimg src=toppng alt=top gtltagtlttdgt
lttd class=externgtlta href=next talattributes=href
pythoncurrent+herenavigate(rsquonextrsquothisSlideId)gtltimg src=nextpng alt=next gtltagtlttdgtltdivgt
ltdiv metalfill-slot=page_header talomit-tag=taldefine=thisSlideId requestslidethisSlide pythongetattr(herethisSlideId)gt
lth1 talcontent=pythonherexmlnode(thisSlidersquotitlersquo)gt
content titlelth1gt
67
lth2 talcondition=pythonherexmlnode(thisSlidersquosubtitlersquo)talcontent=pythonherexmlnode(thisSlidersquosubtitlersquo)talon-error=nothinggtoptional subtitlelth2gt
ltdivgtltdiv metalfill-slot=main class=margins
talomit-tag= taldefine=thisSlideId requestslidethisSlide pythongetattr(herethisSlideId)gt
ltspan class=titletalcondition=pythonthisSlideId==rsquoTitlersquogt
ltemgtltpre class=title
talcontent=pythonherexmlnode(thisSlidersquoauthorrsquo)
talon-error=nothinggtoptional authorltpregtltemgtltspangt
ltspan talcondition=pythonherexmlnode(thisSlidersquobodyrsquo)talreplace=structure
pythonherexmlnode(thisSlidersquobodyrsquo)talon-error=nothinggtoptional bodyltspangt
ltdivgtltbodygt
lthtmlgt
Anhang C Page Template Dokument layouthtml
ltxml version=10 encoding=iso-8859-1gtltDOCTYPE html PUBLIC -W3CDTD XHTML 11EN
httpwwww3orgTRxhtml11DTDxhtml11dtdgtlthtml xmlns=httpwwww3org1999xhtml
lang=de xmllang=dexmlnstal=httpxmlzopeorgnamespacestalxmlnsmetal=httpxmlzopeorgnamespacesmetalmetaldefine-macro=layoutgt
lthead metaldefine-slot=headgtltmeta http-equiv=Content-Type
content=texthtml charset=iso-8859-1 gtlttitlegtltspan talreplace=containertitlegtContext title
68
ltspangtltspan talcondition=containertitle
talreplace=string - gt - ltspangtltspan talreplace=heretitlegtThe titleltspangt
lttitlegtltlink metaldefine-slot=style rel=stylesheet
href=standard_style_netscapecsstype=textcss gt
ltheadgt
ltbodygtlttable class=externgtlttbodygtlttr class=externgtlttd class=externgtlta href=httpwwwfh-augsburgdegtltimg src=fha_logo alt=FH Augsburg gt
ltagtlttdgtlttd class=externgtlttdgt
lttrgtlttr valign=top class=externgtlttd class=externgtlttable class=externgtltcaptiongtltcaptiongtlttbodygtlttr class=navigationgtltmetalblock define-slot=navigationgtlttd class=navigationgtlta href=prevgt
ltimg src=prevpng alt=previous gtltagtlttdgt
lttd class= navigation gtlta href=topgt
ltimg src=toppng alt=top gtltagtlttdgt
lttd class= navigation gtlta href=nextgt
ltimg src=nextpng alt=next gtltagtlttdgt
ltmetalblockgtlttrgtlttbodygt
lttablegtlttdgtlttd class=page_headergt
69
ltmetalblock define-slot=page_headergtlth1gtpage titlelth1gtlth2gtand subtitle will be herelth2gt
ltmetalblockgtlttdgt
lttrgtlttr class=externgtlttd class=externgtlttdgtlttd class=maingtltmetalblock define-slot=maingtltulgtltligtmainltligtltligtinformationltligtltligtwillltligtltligtbe hereltligtltulgt
ltmetalblockgtlttdgt
lttrgtlttbodygt
lttablegtltbodygtlthtmlgt
70
return None
Als Beispiel kann die folgende Abbildung 3 eines Vortrags uber Online Graphics withSVG [Kle02] angesehen werden
Abbildung 3 HTML Slide erzeugt aus XML Schema Dokument mittels Parsed XML und PageTem-plates auf Zope
6 Ergebnis
Auch wenn der Open Source Web- und Application-Server Software Zope noch nicht alsreiner XML Webserver betitelt werden kann so ist eine Verarbeitung von XML Dokumen-ten mit einer XHTML Anzeige auch moglich ohne die geschlossene Umgebung von Zopezu verlassen Dafur sind jedoch noch die Zope Produkte (Programmpakete) Parsed XMLund Page Templates notwendig Parsed XML ist ein auf dem Python Expat aufbauenderXML Parser mit einer standardisierten DOM-Schnittstelle der die Eigenschaften von Zo-pe ubernimmt und als API anbietet Zusammen mit Page Templates einer auf Attributenbasierten Erweiterung von XHTML wird somit fur Zope die Basis zur XML Verarbeitungund XHTML Anzeige gelegt Mit dieser Methode XML Dokumente in Zope zu verar-beiten wird eine Moglichkeit geschaffen die Flexibilitat und Erweiterbarkeit von Zope
64
auch bei der XML-Verarbeitung auszunutzen Die vorgezeigte Methode wird mit einemBeispiel einer einfachen Anwendung fur eine dynamische HTML Navigation aus XMLDokumenten mit einer Struktur fur Slides dargestellt
Literatur
[Adl00] Adler etal Extensible Stylesheet Language httpwwww3orgTRxsl 2000
[Aye00] Ayeva et al Zope Book Project httpzdpzopeorgprojectszbook 2000
[Bai02] Baier etal XML Schema Teil 0 1 2 httpwwwedition-w3cde 2002
[Bee02] httpwwwbeehivede 2002
[Bir01] Biron etal XML Schema Part 2 Datatypes httpwwww3orgTRxmlschema-2 2001
[Bos98] Bos etal Cascading Style Sheets httpwwww3orgTRREC-CSS2 1998
[Bra98] Bray etal Extensible Markup Language httpwwww3orgTRREC-xml 1998
[CGI02] httphoohooncsauiuceducaiinterfacehtml 2002
[Faa02] Faassen Parsed XML httpwwwzopeorgmembersfassenParsedXML 2002
[Fal01] Fallside XML Schema Part 0 Primer httpwwww3orgTRxmlschema-0 2001
[Inf02] httpwwwinfraecom 2002
[Iuv02] httpwwwiuvenocom 2002
[Kle02] Klever Online Graphics with SVG httpxmlfh-augsburgdeSVGICL2002 2002
[Lat00] Latteier Pelletier The Zope Book httpwwwzopeorgdocumentation 2000
[LeH00] LeHors et al Document Object Model (DOM) Level 2 Core Specificationhttpwwww3orgTRDOM-Level-2-Core 2000
[Pem00] Pemberton et al XHTML 10 The Extensible HyperText Markup Languagehttpwwww3orgTR2000REC-xhtml1-20000126 2000
[Pro02] httpwwwzopeorgproductsall products 2002
[Tho01] Thompson etal XML Schema Part 1 Structures httpwwww3orgTRxmlschema-12001
[vR02] vRossum Drake Python Reference Manual httpwwwpythonorg 2002
65
Anhang A XML Schema Dokument slidesxsd
ltschema xmlnsxsd=httpwwww3org2001XMLSchemaxmlns=httpwwwexamplecomslidestargetNamespace=httpwwwexamplecomslideselementFormDefault=unqualifiedattributeFormDefault=unqualifiedgt
ltxsdelement name=slidegtltxsdcomplexTypegtltxsdsequencegtltxsdelement name=title type=xsdstringgtltxsdelement name=subtitle type=xsdstring
minOccurs=0gtltxsdelement name=author minOccurs=0gtltxsdcomplexType mixed=truegtltxsdsequencegtltxsdelement name=company type=xsdstring
minOccurs=0gtltxsdsequencegtltxsdcomplexTypegt
ltxsdelementgtltxsdelement name=body minOccurs=0gtltxsdcomplexType mixed=truegtltxsdsequencegtltxsdany namespace=httpwwww3org1999xhtml
minOccurs=0 maxOccurs=unboundedprocessContents=laxgt
ltxsdsequencegtltxsdanyAttribute
namespace=httpwwww3org1999xhtmlgtltxsdcomplexTypegt
ltxsdelementgtltxsdsequencegt
ltxsdcomplexTypegtltxsdelementgt
ltxsdschemagt
Anhang B Page Template Dokument slideshtml
ltxml version=10 encoding=iso-8859-1gtltDOCTYPE HTML PUBLIC
-W3CDTD HTML 401 TransitionalENhttpwwww3orgTRhtml4strictdtdgt
66
lthtml xmlns=httpwwww3org1999xhtml lang=enxmllang=enxmlnstal=httpxmlzopeorgnamespacestalxmlnsmetal=httpxmlzopeorgnamespacesmetaltaldefine=global thisSlideId requestslideglobal thisSlide pythongetattr(herethisSlideId)metaluse-macro=containerlayouthtmlmacroslayoutgt
ltheadgtltdiv metalfill-slot=style talomit-tag=gtltlink talcondition=python
modules[rsquostringrsquo]find(request[rsquoHTTP_USER_AGENTrsquo]rsquoGecko2002rsquo) = -1 rel=stylesheettype=textcsshref=standard_style_mozillacss gt
ltlink talcondition=pythonmodules[rsquostringrsquo]find(request[rsquoHTTP_USER_AGENTrsquo]rsquoWindowsrsquo) = -1 rel=stylesheet type=textcsshref=standard_style_windowscss gtltdivgt
ltheadgt
ltbodygtltdiv class=navigation metalfill-slot=navigation
taldefine=thisSlideId requestslidecurrent pythonstr(hereabsolute_url())+rsquoslides_htmlslide=rsquogt
lttd class=externgtlta href=prev talattributes=href
pythoncurrent+herenavigate(rsquoprevrsquothisSlideId)gtltimg src=prevpng alt=previous gtltagtlttdgt
lttd class=externgtlta href=top talattributes=href
pythoncurrent+herenavigate(rsquotoprsquothisSlideId)gtltimg src=toppng alt=top gtltagtlttdgt
lttd class=externgtlta href=next talattributes=href
pythoncurrent+herenavigate(rsquonextrsquothisSlideId)gtltimg src=nextpng alt=next gtltagtlttdgtltdivgt
ltdiv metalfill-slot=page_header talomit-tag=taldefine=thisSlideId requestslidethisSlide pythongetattr(herethisSlideId)gt
lth1 talcontent=pythonherexmlnode(thisSlidersquotitlersquo)gt
content titlelth1gt
67
lth2 talcondition=pythonherexmlnode(thisSlidersquosubtitlersquo)talcontent=pythonherexmlnode(thisSlidersquosubtitlersquo)talon-error=nothinggtoptional subtitlelth2gt
ltdivgtltdiv metalfill-slot=main class=margins
talomit-tag= taldefine=thisSlideId requestslidethisSlide pythongetattr(herethisSlideId)gt
ltspan class=titletalcondition=pythonthisSlideId==rsquoTitlersquogt
ltemgtltpre class=title
talcontent=pythonherexmlnode(thisSlidersquoauthorrsquo)
talon-error=nothinggtoptional authorltpregtltemgtltspangt
ltspan talcondition=pythonherexmlnode(thisSlidersquobodyrsquo)talreplace=structure
pythonherexmlnode(thisSlidersquobodyrsquo)talon-error=nothinggtoptional bodyltspangt
ltdivgtltbodygt
lthtmlgt
Anhang C Page Template Dokument layouthtml
ltxml version=10 encoding=iso-8859-1gtltDOCTYPE html PUBLIC -W3CDTD XHTML 11EN
httpwwww3orgTRxhtml11DTDxhtml11dtdgtlthtml xmlns=httpwwww3org1999xhtml
lang=de xmllang=dexmlnstal=httpxmlzopeorgnamespacestalxmlnsmetal=httpxmlzopeorgnamespacesmetalmetaldefine-macro=layoutgt
lthead metaldefine-slot=headgtltmeta http-equiv=Content-Type
content=texthtml charset=iso-8859-1 gtlttitlegtltspan talreplace=containertitlegtContext title
68
ltspangtltspan talcondition=containertitle
talreplace=string - gt - ltspangtltspan talreplace=heretitlegtThe titleltspangt
lttitlegtltlink metaldefine-slot=style rel=stylesheet
href=standard_style_netscapecsstype=textcss gt
ltheadgt
ltbodygtlttable class=externgtlttbodygtlttr class=externgtlttd class=externgtlta href=httpwwwfh-augsburgdegtltimg src=fha_logo alt=FH Augsburg gt
ltagtlttdgtlttd class=externgtlttdgt
lttrgtlttr valign=top class=externgtlttd class=externgtlttable class=externgtltcaptiongtltcaptiongtlttbodygtlttr class=navigationgtltmetalblock define-slot=navigationgtlttd class=navigationgtlta href=prevgt
ltimg src=prevpng alt=previous gtltagtlttdgt
lttd class= navigation gtlta href=topgt
ltimg src=toppng alt=top gtltagtlttdgt
lttd class= navigation gtlta href=nextgt
ltimg src=nextpng alt=next gtltagtlttdgt
ltmetalblockgtlttrgtlttbodygt
lttablegtlttdgtlttd class=page_headergt
69
ltmetalblock define-slot=page_headergtlth1gtpage titlelth1gtlth2gtand subtitle will be herelth2gt
ltmetalblockgtlttdgt
lttrgtlttr class=externgtlttd class=externgtlttdgtlttd class=maingtltmetalblock define-slot=maingtltulgtltligtmainltligtltligtinformationltligtltligtwillltligtltligtbe hereltligtltulgt
ltmetalblockgtlttdgt
lttrgtlttbodygt
lttablegtltbodygtlthtmlgt
70
auch bei der XML-Verarbeitung auszunutzen Die vorgezeigte Methode wird mit einemBeispiel einer einfachen Anwendung fur eine dynamische HTML Navigation aus XMLDokumenten mit einer Struktur fur Slides dargestellt
Literatur
[Adl00] Adler etal Extensible Stylesheet Language httpwwww3orgTRxsl 2000
[Aye00] Ayeva et al Zope Book Project httpzdpzopeorgprojectszbook 2000
[Bai02] Baier etal XML Schema Teil 0 1 2 httpwwwedition-w3cde 2002
[Bee02] httpwwwbeehivede 2002
[Bir01] Biron etal XML Schema Part 2 Datatypes httpwwww3orgTRxmlschema-2 2001
[Bos98] Bos etal Cascading Style Sheets httpwwww3orgTRREC-CSS2 1998
[Bra98] Bray etal Extensible Markup Language httpwwww3orgTRREC-xml 1998
[CGI02] httphoohooncsauiuceducaiinterfacehtml 2002
[Faa02] Faassen Parsed XML httpwwwzopeorgmembersfassenParsedXML 2002
[Fal01] Fallside XML Schema Part 0 Primer httpwwww3orgTRxmlschema-0 2001
[Inf02] httpwwwinfraecom 2002
[Iuv02] httpwwwiuvenocom 2002
[Kle02] Klever Online Graphics with SVG httpxmlfh-augsburgdeSVGICL2002 2002
[Lat00] Latteier Pelletier The Zope Book httpwwwzopeorgdocumentation 2000
[LeH00] LeHors et al Document Object Model (DOM) Level 2 Core Specificationhttpwwww3orgTRDOM-Level-2-Core 2000
[Pem00] Pemberton et al XHTML 10 The Extensible HyperText Markup Languagehttpwwww3orgTR2000REC-xhtml1-20000126 2000
[Pro02] httpwwwzopeorgproductsall products 2002
[Tho01] Thompson etal XML Schema Part 1 Structures httpwwww3orgTRxmlschema-12001
[vR02] vRossum Drake Python Reference Manual httpwwwpythonorg 2002
65
Anhang A XML Schema Dokument slidesxsd
ltschema xmlnsxsd=httpwwww3org2001XMLSchemaxmlns=httpwwwexamplecomslidestargetNamespace=httpwwwexamplecomslideselementFormDefault=unqualifiedattributeFormDefault=unqualifiedgt
ltxsdelement name=slidegtltxsdcomplexTypegtltxsdsequencegtltxsdelement name=title type=xsdstringgtltxsdelement name=subtitle type=xsdstring
minOccurs=0gtltxsdelement name=author minOccurs=0gtltxsdcomplexType mixed=truegtltxsdsequencegtltxsdelement name=company type=xsdstring
minOccurs=0gtltxsdsequencegtltxsdcomplexTypegt
ltxsdelementgtltxsdelement name=body minOccurs=0gtltxsdcomplexType mixed=truegtltxsdsequencegtltxsdany namespace=httpwwww3org1999xhtml
minOccurs=0 maxOccurs=unboundedprocessContents=laxgt
ltxsdsequencegtltxsdanyAttribute
namespace=httpwwww3org1999xhtmlgtltxsdcomplexTypegt
ltxsdelementgtltxsdsequencegt
ltxsdcomplexTypegtltxsdelementgt
ltxsdschemagt
Anhang B Page Template Dokument slideshtml
ltxml version=10 encoding=iso-8859-1gtltDOCTYPE HTML PUBLIC
-W3CDTD HTML 401 TransitionalENhttpwwww3orgTRhtml4strictdtdgt
66
lthtml xmlns=httpwwww3org1999xhtml lang=enxmllang=enxmlnstal=httpxmlzopeorgnamespacestalxmlnsmetal=httpxmlzopeorgnamespacesmetaltaldefine=global thisSlideId requestslideglobal thisSlide pythongetattr(herethisSlideId)metaluse-macro=containerlayouthtmlmacroslayoutgt
ltheadgtltdiv metalfill-slot=style talomit-tag=gtltlink talcondition=python
modules[rsquostringrsquo]find(request[rsquoHTTP_USER_AGENTrsquo]rsquoGecko2002rsquo) = -1 rel=stylesheettype=textcsshref=standard_style_mozillacss gt
ltlink talcondition=pythonmodules[rsquostringrsquo]find(request[rsquoHTTP_USER_AGENTrsquo]rsquoWindowsrsquo) = -1 rel=stylesheet type=textcsshref=standard_style_windowscss gtltdivgt
ltheadgt
ltbodygtltdiv class=navigation metalfill-slot=navigation
taldefine=thisSlideId requestslidecurrent pythonstr(hereabsolute_url())+rsquoslides_htmlslide=rsquogt
lttd class=externgtlta href=prev talattributes=href
pythoncurrent+herenavigate(rsquoprevrsquothisSlideId)gtltimg src=prevpng alt=previous gtltagtlttdgt
lttd class=externgtlta href=top talattributes=href
pythoncurrent+herenavigate(rsquotoprsquothisSlideId)gtltimg src=toppng alt=top gtltagtlttdgt
lttd class=externgtlta href=next talattributes=href
pythoncurrent+herenavigate(rsquonextrsquothisSlideId)gtltimg src=nextpng alt=next gtltagtlttdgtltdivgt
ltdiv metalfill-slot=page_header talomit-tag=taldefine=thisSlideId requestslidethisSlide pythongetattr(herethisSlideId)gt
lth1 talcontent=pythonherexmlnode(thisSlidersquotitlersquo)gt
content titlelth1gt
67
lth2 talcondition=pythonherexmlnode(thisSlidersquosubtitlersquo)talcontent=pythonherexmlnode(thisSlidersquosubtitlersquo)talon-error=nothinggtoptional subtitlelth2gt
ltdivgtltdiv metalfill-slot=main class=margins
talomit-tag= taldefine=thisSlideId requestslidethisSlide pythongetattr(herethisSlideId)gt
ltspan class=titletalcondition=pythonthisSlideId==rsquoTitlersquogt
ltemgtltpre class=title
talcontent=pythonherexmlnode(thisSlidersquoauthorrsquo)
talon-error=nothinggtoptional authorltpregtltemgtltspangt
ltspan talcondition=pythonherexmlnode(thisSlidersquobodyrsquo)talreplace=structure
pythonherexmlnode(thisSlidersquobodyrsquo)talon-error=nothinggtoptional bodyltspangt
ltdivgtltbodygt
lthtmlgt
Anhang C Page Template Dokument layouthtml
ltxml version=10 encoding=iso-8859-1gtltDOCTYPE html PUBLIC -W3CDTD XHTML 11EN
httpwwww3orgTRxhtml11DTDxhtml11dtdgtlthtml xmlns=httpwwww3org1999xhtml
lang=de xmllang=dexmlnstal=httpxmlzopeorgnamespacestalxmlnsmetal=httpxmlzopeorgnamespacesmetalmetaldefine-macro=layoutgt
lthead metaldefine-slot=headgtltmeta http-equiv=Content-Type
content=texthtml charset=iso-8859-1 gtlttitlegtltspan talreplace=containertitlegtContext title
68
ltspangtltspan talcondition=containertitle
talreplace=string - gt - ltspangtltspan talreplace=heretitlegtThe titleltspangt
lttitlegtltlink metaldefine-slot=style rel=stylesheet
href=standard_style_netscapecsstype=textcss gt
ltheadgt
ltbodygtlttable class=externgtlttbodygtlttr class=externgtlttd class=externgtlta href=httpwwwfh-augsburgdegtltimg src=fha_logo alt=FH Augsburg gt
ltagtlttdgtlttd class=externgtlttdgt
lttrgtlttr valign=top class=externgtlttd class=externgtlttable class=externgtltcaptiongtltcaptiongtlttbodygtlttr class=navigationgtltmetalblock define-slot=navigationgtlttd class=navigationgtlta href=prevgt
ltimg src=prevpng alt=previous gtltagtlttdgt
lttd class= navigation gtlta href=topgt
ltimg src=toppng alt=top gtltagtlttdgt
lttd class= navigation gtlta href=nextgt
ltimg src=nextpng alt=next gtltagtlttdgt
ltmetalblockgtlttrgtlttbodygt
lttablegtlttdgtlttd class=page_headergt
69
ltmetalblock define-slot=page_headergtlth1gtpage titlelth1gtlth2gtand subtitle will be herelth2gt
ltmetalblockgtlttdgt
lttrgtlttr class=externgtlttd class=externgtlttdgtlttd class=maingtltmetalblock define-slot=maingtltulgtltligtmainltligtltligtinformationltligtltligtwillltligtltligtbe hereltligtltulgt
ltmetalblockgtlttdgt
lttrgtlttbodygt
lttablegtltbodygtlthtmlgt
70
Anhang A XML Schema Dokument slidesxsd
ltschema xmlnsxsd=httpwwww3org2001XMLSchemaxmlns=httpwwwexamplecomslidestargetNamespace=httpwwwexamplecomslideselementFormDefault=unqualifiedattributeFormDefault=unqualifiedgt
ltxsdelement name=slidegtltxsdcomplexTypegtltxsdsequencegtltxsdelement name=title type=xsdstringgtltxsdelement name=subtitle type=xsdstring
minOccurs=0gtltxsdelement name=author minOccurs=0gtltxsdcomplexType mixed=truegtltxsdsequencegtltxsdelement name=company type=xsdstring
minOccurs=0gtltxsdsequencegtltxsdcomplexTypegt
ltxsdelementgtltxsdelement name=body minOccurs=0gtltxsdcomplexType mixed=truegtltxsdsequencegtltxsdany namespace=httpwwww3org1999xhtml
minOccurs=0 maxOccurs=unboundedprocessContents=laxgt
ltxsdsequencegtltxsdanyAttribute
namespace=httpwwww3org1999xhtmlgtltxsdcomplexTypegt
ltxsdelementgtltxsdsequencegt
ltxsdcomplexTypegtltxsdelementgt
ltxsdschemagt
Anhang B Page Template Dokument slideshtml
ltxml version=10 encoding=iso-8859-1gtltDOCTYPE HTML PUBLIC
-W3CDTD HTML 401 TransitionalENhttpwwww3orgTRhtml4strictdtdgt
66
lthtml xmlns=httpwwww3org1999xhtml lang=enxmllang=enxmlnstal=httpxmlzopeorgnamespacestalxmlnsmetal=httpxmlzopeorgnamespacesmetaltaldefine=global thisSlideId requestslideglobal thisSlide pythongetattr(herethisSlideId)metaluse-macro=containerlayouthtmlmacroslayoutgt
ltheadgtltdiv metalfill-slot=style talomit-tag=gtltlink talcondition=python
modules[rsquostringrsquo]find(request[rsquoHTTP_USER_AGENTrsquo]rsquoGecko2002rsquo) = -1 rel=stylesheettype=textcsshref=standard_style_mozillacss gt
ltlink talcondition=pythonmodules[rsquostringrsquo]find(request[rsquoHTTP_USER_AGENTrsquo]rsquoWindowsrsquo) = -1 rel=stylesheet type=textcsshref=standard_style_windowscss gtltdivgt
ltheadgt
ltbodygtltdiv class=navigation metalfill-slot=navigation
taldefine=thisSlideId requestslidecurrent pythonstr(hereabsolute_url())+rsquoslides_htmlslide=rsquogt
lttd class=externgtlta href=prev talattributes=href
pythoncurrent+herenavigate(rsquoprevrsquothisSlideId)gtltimg src=prevpng alt=previous gtltagtlttdgt
lttd class=externgtlta href=top talattributes=href
pythoncurrent+herenavigate(rsquotoprsquothisSlideId)gtltimg src=toppng alt=top gtltagtlttdgt
lttd class=externgtlta href=next talattributes=href
pythoncurrent+herenavigate(rsquonextrsquothisSlideId)gtltimg src=nextpng alt=next gtltagtlttdgtltdivgt
ltdiv metalfill-slot=page_header talomit-tag=taldefine=thisSlideId requestslidethisSlide pythongetattr(herethisSlideId)gt
lth1 talcontent=pythonherexmlnode(thisSlidersquotitlersquo)gt
content titlelth1gt
67
lth2 talcondition=pythonherexmlnode(thisSlidersquosubtitlersquo)talcontent=pythonherexmlnode(thisSlidersquosubtitlersquo)talon-error=nothinggtoptional subtitlelth2gt
ltdivgtltdiv metalfill-slot=main class=margins
talomit-tag= taldefine=thisSlideId requestslidethisSlide pythongetattr(herethisSlideId)gt
ltspan class=titletalcondition=pythonthisSlideId==rsquoTitlersquogt
ltemgtltpre class=title
talcontent=pythonherexmlnode(thisSlidersquoauthorrsquo)
talon-error=nothinggtoptional authorltpregtltemgtltspangt
ltspan talcondition=pythonherexmlnode(thisSlidersquobodyrsquo)talreplace=structure
pythonherexmlnode(thisSlidersquobodyrsquo)talon-error=nothinggtoptional bodyltspangt
ltdivgtltbodygt
lthtmlgt
Anhang C Page Template Dokument layouthtml
ltxml version=10 encoding=iso-8859-1gtltDOCTYPE html PUBLIC -W3CDTD XHTML 11EN
httpwwww3orgTRxhtml11DTDxhtml11dtdgtlthtml xmlns=httpwwww3org1999xhtml
lang=de xmllang=dexmlnstal=httpxmlzopeorgnamespacestalxmlnsmetal=httpxmlzopeorgnamespacesmetalmetaldefine-macro=layoutgt
lthead metaldefine-slot=headgtltmeta http-equiv=Content-Type
content=texthtml charset=iso-8859-1 gtlttitlegtltspan talreplace=containertitlegtContext title
68
ltspangtltspan talcondition=containertitle
talreplace=string - gt - ltspangtltspan talreplace=heretitlegtThe titleltspangt
lttitlegtltlink metaldefine-slot=style rel=stylesheet
href=standard_style_netscapecsstype=textcss gt
ltheadgt
ltbodygtlttable class=externgtlttbodygtlttr class=externgtlttd class=externgtlta href=httpwwwfh-augsburgdegtltimg src=fha_logo alt=FH Augsburg gt
ltagtlttdgtlttd class=externgtlttdgt
lttrgtlttr valign=top class=externgtlttd class=externgtlttable class=externgtltcaptiongtltcaptiongtlttbodygtlttr class=navigationgtltmetalblock define-slot=navigationgtlttd class=navigationgtlta href=prevgt
ltimg src=prevpng alt=previous gtltagtlttdgt
lttd class= navigation gtlta href=topgt
ltimg src=toppng alt=top gtltagtlttdgt
lttd class= navigation gtlta href=nextgt
ltimg src=nextpng alt=next gtltagtlttdgt
ltmetalblockgtlttrgtlttbodygt
lttablegtlttdgtlttd class=page_headergt
69
ltmetalblock define-slot=page_headergtlth1gtpage titlelth1gtlth2gtand subtitle will be herelth2gt
ltmetalblockgtlttdgt
lttrgtlttr class=externgtlttd class=externgtlttdgtlttd class=maingtltmetalblock define-slot=maingtltulgtltligtmainltligtltligtinformationltligtltligtwillltligtltligtbe hereltligtltulgt
ltmetalblockgtlttdgt
lttrgtlttbodygt
lttablegtltbodygtlthtmlgt
70
lthtml xmlns=httpwwww3org1999xhtml lang=enxmllang=enxmlnstal=httpxmlzopeorgnamespacestalxmlnsmetal=httpxmlzopeorgnamespacesmetaltaldefine=global thisSlideId requestslideglobal thisSlide pythongetattr(herethisSlideId)metaluse-macro=containerlayouthtmlmacroslayoutgt
ltheadgtltdiv metalfill-slot=style talomit-tag=gtltlink talcondition=python
modules[rsquostringrsquo]find(request[rsquoHTTP_USER_AGENTrsquo]rsquoGecko2002rsquo) = -1 rel=stylesheettype=textcsshref=standard_style_mozillacss gt
ltlink talcondition=pythonmodules[rsquostringrsquo]find(request[rsquoHTTP_USER_AGENTrsquo]rsquoWindowsrsquo) = -1 rel=stylesheet type=textcsshref=standard_style_windowscss gtltdivgt
ltheadgt
ltbodygtltdiv class=navigation metalfill-slot=navigation
taldefine=thisSlideId requestslidecurrent pythonstr(hereabsolute_url())+rsquoslides_htmlslide=rsquogt
lttd class=externgtlta href=prev talattributes=href
pythoncurrent+herenavigate(rsquoprevrsquothisSlideId)gtltimg src=prevpng alt=previous gtltagtlttdgt
lttd class=externgtlta href=top talattributes=href
pythoncurrent+herenavigate(rsquotoprsquothisSlideId)gtltimg src=toppng alt=top gtltagtlttdgt
lttd class=externgtlta href=next talattributes=href
pythoncurrent+herenavigate(rsquonextrsquothisSlideId)gtltimg src=nextpng alt=next gtltagtlttdgtltdivgt
ltdiv metalfill-slot=page_header talomit-tag=taldefine=thisSlideId requestslidethisSlide pythongetattr(herethisSlideId)gt
lth1 talcontent=pythonherexmlnode(thisSlidersquotitlersquo)gt
content titlelth1gt
67
lth2 talcondition=pythonherexmlnode(thisSlidersquosubtitlersquo)talcontent=pythonherexmlnode(thisSlidersquosubtitlersquo)talon-error=nothinggtoptional subtitlelth2gt
ltdivgtltdiv metalfill-slot=main class=margins
talomit-tag= taldefine=thisSlideId requestslidethisSlide pythongetattr(herethisSlideId)gt
ltspan class=titletalcondition=pythonthisSlideId==rsquoTitlersquogt
ltemgtltpre class=title
talcontent=pythonherexmlnode(thisSlidersquoauthorrsquo)
talon-error=nothinggtoptional authorltpregtltemgtltspangt
ltspan talcondition=pythonherexmlnode(thisSlidersquobodyrsquo)talreplace=structure
pythonherexmlnode(thisSlidersquobodyrsquo)talon-error=nothinggtoptional bodyltspangt
ltdivgtltbodygt
lthtmlgt
Anhang C Page Template Dokument layouthtml
ltxml version=10 encoding=iso-8859-1gtltDOCTYPE html PUBLIC -W3CDTD XHTML 11EN
httpwwww3orgTRxhtml11DTDxhtml11dtdgtlthtml xmlns=httpwwww3org1999xhtml
lang=de xmllang=dexmlnstal=httpxmlzopeorgnamespacestalxmlnsmetal=httpxmlzopeorgnamespacesmetalmetaldefine-macro=layoutgt
lthead metaldefine-slot=headgtltmeta http-equiv=Content-Type
content=texthtml charset=iso-8859-1 gtlttitlegtltspan talreplace=containertitlegtContext title
68
ltspangtltspan talcondition=containertitle
talreplace=string - gt - ltspangtltspan talreplace=heretitlegtThe titleltspangt
lttitlegtltlink metaldefine-slot=style rel=stylesheet
href=standard_style_netscapecsstype=textcss gt
ltheadgt
ltbodygtlttable class=externgtlttbodygtlttr class=externgtlttd class=externgtlta href=httpwwwfh-augsburgdegtltimg src=fha_logo alt=FH Augsburg gt
ltagtlttdgtlttd class=externgtlttdgt
lttrgtlttr valign=top class=externgtlttd class=externgtlttable class=externgtltcaptiongtltcaptiongtlttbodygtlttr class=navigationgtltmetalblock define-slot=navigationgtlttd class=navigationgtlta href=prevgt
ltimg src=prevpng alt=previous gtltagtlttdgt
lttd class= navigation gtlta href=topgt
ltimg src=toppng alt=top gtltagtlttdgt
lttd class= navigation gtlta href=nextgt
ltimg src=nextpng alt=next gtltagtlttdgt
ltmetalblockgtlttrgtlttbodygt
lttablegtlttdgtlttd class=page_headergt
69
ltmetalblock define-slot=page_headergtlth1gtpage titlelth1gtlth2gtand subtitle will be herelth2gt
ltmetalblockgtlttdgt
lttrgtlttr class=externgtlttd class=externgtlttdgtlttd class=maingtltmetalblock define-slot=maingtltulgtltligtmainltligtltligtinformationltligtltligtwillltligtltligtbe hereltligtltulgt
ltmetalblockgtlttdgt
lttrgtlttbodygt
lttablegtltbodygtlthtmlgt
70
lth2 talcondition=pythonherexmlnode(thisSlidersquosubtitlersquo)talcontent=pythonherexmlnode(thisSlidersquosubtitlersquo)talon-error=nothinggtoptional subtitlelth2gt
ltdivgtltdiv metalfill-slot=main class=margins
talomit-tag= taldefine=thisSlideId requestslidethisSlide pythongetattr(herethisSlideId)gt
ltspan class=titletalcondition=pythonthisSlideId==rsquoTitlersquogt
ltemgtltpre class=title
talcontent=pythonherexmlnode(thisSlidersquoauthorrsquo)
talon-error=nothinggtoptional authorltpregtltemgtltspangt
ltspan talcondition=pythonherexmlnode(thisSlidersquobodyrsquo)talreplace=structure
pythonherexmlnode(thisSlidersquobodyrsquo)talon-error=nothinggtoptional bodyltspangt
ltdivgtltbodygt
lthtmlgt
Anhang C Page Template Dokument layouthtml
ltxml version=10 encoding=iso-8859-1gtltDOCTYPE html PUBLIC -W3CDTD XHTML 11EN
httpwwww3orgTRxhtml11DTDxhtml11dtdgtlthtml xmlns=httpwwww3org1999xhtml
lang=de xmllang=dexmlnstal=httpxmlzopeorgnamespacestalxmlnsmetal=httpxmlzopeorgnamespacesmetalmetaldefine-macro=layoutgt
lthead metaldefine-slot=headgtltmeta http-equiv=Content-Type
content=texthtml charset=iso-8859-1 gtlttitlegtltspan talreplace=containertitlegtContext title
68
ltspangtltspan talcondition=containertitle
talreplace=string - gt - ltspangtltspan talreplace=heretitlegtThe titleltspangt
lttitlegtltlink metaldefine-slot=style rel=stylesheet
href=standard_style_netscapecsstype=textcss gt
ltheadgt
ltbodygtlttable class=externgtlttbodygtlttr class=externgtlttd class=externgtlta href=httpwwwfh-augsburgdegtltimg src=fha_logo alt=FH Augsburg gt
ltagtlttdgtlttd class=externgtlttdgt
lttrgtlttr valign=top class=externgtlttd class=externgtlttable class=externgtltcaptiongtltcaptiongtlttbodygtlttr class=navigationgtltmetalblock define-slot=navigationgtlttd class=navigationgtlta href=prevgt
ltimg src=prevpng alt=previous gtltagtlttdgt
lttd class= navigation gtlta href=topgt
ltimg src=toppng alt=top gtltagtlttdgt
lttd class= navigation gtlta href=nextgt
ltimg src=nextpng alt=next gtltagtlttdgt
ltmetalblockgtlttrgtlttbodygt
lttablegtlttdgtlttd class=page_headergt
69
ltmetalblock define-slot=page_headergtlth1gtpage titlelth1gtlth2gtand subtitle will be herelth2gt
ltmetalblockgtlttdgt
lttrgtlttr class=externgtlttd class=externgtlttdgtlttd class=maingtltmetalblock define-slot=maingtltulgtltligtmainltligtltligtinformationltligtltligtwillltligtltligtbe hereltligtltulgt
ltmetalblockgtlttdgt
lttrgtlttbodygt
lttablegtltbodygtlthtmlgt
70
ltspangtltspan talcondition=containertitle
talreplace=string - gt - ltspangtltspan talreplace=heretitlegtThe titleltspangt
lttitlegtltlink metaldefine-slot=style rel=stylesheet
href=standard_style_netscapecsstype=textcss gt
ltheadgt
ltbodygtlttable class=externgtlttbodygtlttr class=externgtlttd class=externgtlta href=httpwwwfh-augsburgdegtltimg src=fha_logo alt=FH Augsburg gt
ltagtlttdgtlttd class=externgtlttdgt
lttrgtlttr valign=top class=externgtlttd class=externgtlttable class=externgtltcaptiongtltcaptiongtlttbodygtlttr class=navigationgtltmetalblock define-slot=navigationgtlttd class=navigationgtlta href=prevgt
ltimg src=prevpng alt=previous gtltagtlttdgt
lttd class= navigation gtlta href=topgt
ltimg src=toppng alt=top gtltagtlttdgt
lttd class= navigation gtlta href=nextgt
ltimg src=nextpng alt=next gtltagtlttdgt
ltmetalblockgtlttrgtlttbodygt
lttablegtlttdgtlttd class=page_headergt
69
ltmetalblock define-slot=page_headergtlth1gtpage titlelth1gtlth2gtand subtitle will be herelth2gt
ltmetalblockgtlttdgt
lttrgtlttr class=externgtlttd class=externgtlttdgtlttd class=maingtltmetalblock define-slot=maingtltulgtltligtmainltligtltligtinformationltligtltligtwillltligtltligtbe hereltligtltulgt
ltmetalblockgtlttdgt
lttrgtlttbodygt
lttablegtltbodygtlthtmlgt
70
ltmetalblock define-slot=page_headergtlth1gtpage titlelth1gtlth2gtand subtitle will be herelth2gt
ltmetalblockgtlttdgt
lttrgtlttr class=externgtlttd class=externgtlttdgtlttd class=maingtltmetalblock define-slot=maingtltulgtltligtmainltligtltligtinformationltligtltligtwillltligtltligtbe hereltligtltulgt
ltmetalblockgtlttdgt
lttrgtlttbodygt
lttablegtltbodygtlthtmlgt
70