Die Transformation von Datentabellen-Inhalten lässt sich mit DTML sehr einfach realisieren, da hier die leistungesfähigen Listen-Operationen von Zope bzw, ZMS zum Einsatz kommen können. Das Beispiel zeigt einen einfachen Eport-Filter, der lediglich aus einer einzigen DTML-Methode besteht (s. weiter unten).

zmsFilter_litExportWord2003

Der Filter „Word2003-Literatur“wird über das im-/Export-Menü aufgerufen und erzeugt einen WordML-Strom auf der Basis einer DTML-Methode

DTML-Code der Transformations-Methode für Literaturstellen: der WordML- bzw. XML-Datenstrom wird zeilenweise in die REQUEST-Variable litlist geschrieben. Dabei ummanteln Word-spezifische Header und Footer den eigentlichen Inhalt. Ein Literatur-Item besteht aus Kurztitel/ID, Autor, Titel, Journal, Issue.

<dtml-call "RESPONSE.setHeader('Content-Type','application/msword')">
<dtml-call "REQUEST.set('litlist',[])">

<dtml-comment>
###################################################################################
# WORD 2003 Header
###################################################################################
</dtml-comment>

<dtml-call "litlist.append('<?xml version='+QUOT+'1.0'+QUOT+' encoding='+QUOT+'UTF-8'+QUOT+' standalone='+QUOT+'yes'+QUOT+'?><?mso-application progid='+QUOT+'Word.Document'+QUOT+'?>')">
<dtml-call "litlist.append('<w:wordDocument ')">
<dtml-call "litlist.append(' xmlns:w='+QUOT+'http://schemas.microsoft.com/office/word/2003/wordml'+QUOT)">
<dtml-call "litlist.append(' xmlns:v='+QUOT+'urn:schemas-microsoft-com:vml'+QUOT)">
<dtml-call "litlist.append(' xmlns:w10='+QUOT+'urn:schemas-microsoft-com:office:word'+QUOT)">
<dtml-call "litlist.append(' xmlns:sl='+QUOT+'http://schemas.microsoft.com/schemaLibrary/2003/core'+QUOT)">
<dtml-call "litlist.append(' xmlns:aml='+QUOT+'http://schemas.microsoft.com/aml/2001/core'+QUOT)">
<dtml-call "litlist.append(' xmlns:wx='+QUOT+'http://schemas.microsoft.com/office/word/2003/auxHint'+QUOT)"> 
<dtml-call "litlist.append(' xmlns:o='+QUOT+'urn:schemas-microsoft-com:office:office'+QUOT)">
<dtml-call "litlist.append(' xmlns:dt='+QUOT+'uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'+QUOT)">
<dtml-call "litlist.append(' w:macrosPresent='+QUOT+'no'+QUOT)">
<dtml-call "litlist.append(' w:embeddedObjPresent='+QUOT+'no'+QUOT)">
<dtml-call "litlist.append(' w:ocxPresent='+QUOT+'no'+QUOT)">
<dtml-call "litlist.append(' xml:space='+QUOT+'preserve'+QUOT+'>')">
<dtml-call "litlist.append('<o:DocumentProperties>')">
<dtml-call "litlist.append('<o:Title>ZMS.netbook Formatvorlage</o:Title>')">
<dtml-call "litlist.append('<o:Author>Dr. Frank Hoffmann</o:Author>')">
<dtml-call "litlist.append('</o:DocumentProperties>')">
<dtml-call "litlist.append('<w:styles>')">
<dtml-call "litlist.append('<w:style w:type='+QUOT+'paragraph'+QUOT+' w:styleId='+QUOT+'Literaturstelle'+QUOT+'>')">
<dtml-call "litlist.append('<w:name w:val='+QUOT+'Literaturstelle'+QUOT+' />')">
<dtml-call "litlist.append('<w:basedOn w:val='+QUOT+'Standard'+QUOT+' />')">
<dtml-call "litlist.append('<w:pPr>')">
<dtml-call "litlist.append('<w:pStyle w:val='+QUOT+'Literaturstelle'+QUOT+' />')">
<dtml-call "litlist.append('<w:spacing w:before='+QUOT+'120'+QUOT+' w:after='+QUOT+'120'+QUOT+' />')">
<dtml-call "litlist.append('<w:ind w:left='+QUOT+'1700'+QUOT+' w:hanging='+QUOT+'1700'+QUOT+' />')">
<dtml-call "litlist.append('<w:jc w:val='+QUOT+'left'+QUOT+' />')">
<dtml-call "litlist.append('</w:pPr>')">
<dtml-call "litlist.append('</w:style>')">
<dtml-call "litlist.append('</w:styles>')">
<dtml-call "litlist.append('<w:body>')">
<dtml-call "litlist.append('<wx:sect>')">

<dtml-comment>
###################################################################################
# Items
###################################################################################
</dtml-comment>

<dtml-with items>
 <dtml-call "REQUEST.set('res',getObjProperty('records',REQUEST))">
 <dtml-in res mapping sort=titlealt>
   <dtml-call "litlist.append('  <w:p>')">
   <dtml-call "litlist.append('    <w:pPr><w:pStyle w:val='+QUOT+'Literaturstelle'+QUOT+' /></w:pPr>')">
   <dtml-call "litlist.append('    <w:r><w:t><![CDATA[' + titlealt + ']]></w:t><w:tab wx:wTab='+QUOT+'960'+QUOT+' wx:tlc='+QUOT+'none'+QUOT+' wx:cTlc='+QUOT+'20'+QUOT+' /></w:r>')">
   <dtml-call "litlist.append('    <w:r><w:t><![CDATA[' + author + ']]></w:t></w:r>')">
   <dtml-call "litlist.append('    <w:r><w:br/><w:t><![CDATA[' + title + ']]></w:t></w:r>')">
   <dtml-call "litlist.append('    <w:r><w:br/><w:t><![CDATA[' + journal  + ']]></w:t></w:r>')">
   <dtml-call "litlist.append('    <w:r><w:br/><w:t><![CDATA[' + issue  + ']]></w:t></w:r>')">
   <dtml-call "litlist.append('  </w:p>')">
 </dtml-in>
</dtml-with>

<dtml-comment>
###################################################################################
# WORD 2003 Footer
###################################################################################
</dtml-comment>

<dtml-call "litlist.append('<w:sectPr>')">
<dtml-call "litlist.append('<w:pgSz w:w='+QUOT+'11906'+QUOT+' w:h='+QUOT+'16838'+QUOT+' w:code='+QUOT+'9'+QUOT+'/>')">
<dtml-call "litlist.append('<w:pgMar w:top='+QUOT+'1500'+QUOT+' w:right='+QUOT+'1000'+QUOT+' w:bottom='+QUOT+'1500'+QUOT+' w:left='+QUOT+'1000'+QUOT+' w:header='+QUOT+'1000'+QUOT+' w:footer='+QUOT+'1000'+QUOT+' w:gutter='+QUOT+'0'+QUOT+'/>')">
<dtml-call "litlist.append('<w:cols w:space='+QUOT+'708'+QUOT+'/>')">
<dtml-call "litlist.append('<w:docGrid w:line-pitch='+QUOT+'360'+QUOT+'/>')">
<dtml-call "litlist.append('</w:sectPr>')">
<dtml-call "litlist.append('</wx:sect>')">
<dtml-call "litlist.append('</w:body>')">
<dtml-call "litlist.append('</w:wordDocument>')">


<dtml-comment>
###################################################################################
# filename (localfs_write)
###################################################################################
</dtml-comment>
<dtml-call "REQUEST.set( 'filename', '%s/index.doc'%ZMS_FILTER_CUR_DIR)">
<dtml-call "localfs_write( filename, ''.join(litlist))">
<dtml-call "REQUEST.set('ZMS_FILTER_OUT',filename)">

Die letzten drei Zeilen bedingen die Rückgabe des Stroms unter Einsatz der ZMS-API-Funktion localfs_write(), nachdem der filename (im temporären Arbeitsverzeichnis) den Wert index.doc erhält. Schließlich wird die Datei per ZMS_FILTER_OUT-Variable zurückgegeben.