Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: Don Pasquale am 02.09.03 - 12:37:21

Titel: XML Datei generieren
Beitrag von: Don Pasquale am 02.09.03 - 12:37:21
Hi Folks,

Ich möchte eine XML Datei generieren, bisher habe ich das
in R5 von Hand gemacht.

Ich habe ein NotesDocument mit dem Feld Auto,
pro Dokument soll eine XML Datei generiert werden

Das Dokument soll ganz einfach aufgebaut sein

<?xml version='1.0' encoding='UTF-8'?>
<MAIL>
<COLUMN>
<NAME>AUTO</NAME>
<VALUE>VW Käfer</VALUE>
<TYPE>String</TYPE>
</COLUMN>
</MAIL>


Die Designer Hilfe erschlägt mich förmlich, kann mir einer helfen
und mir sagen wo ich anfangen soll ?

Ciao

Don Pasquale
Titel: Re:XML Datei generieren
Beitrag von: ata am 02.09.03 - 18:23:55
... das Thema habe ich leider erst noch vor mir...

ata
Titel: Re:XML Datei generieren
Beitrag von: Hevelmann am 03.09.03 - 10:15:26
Hallo Don,

hab mal eine Frage bezüglich deines XML Codes:

Was beinhaltet das Tag <Name>? ist es der Feldname aus dem Dokument oder ist es einfach ein fester Wert, der immer im XMLCode stehen soll? Genau die gleiche Frage bezüglich <TYPE>, kann der Wert String aus dem jeweiligen Dokument ausgelesen werden oder ist er immer fest?

Gruss Hevelmann
Titel: Re:XML Datei generieren
Beitrag von: Don Pasquale am 03.09.03 - 10:30:20
Hi Hevelmann,

das <Name>Auto</Auto> ist fix.
Das <Value>VW Käfer</Value>
ändert sich von Dokument zu Dokument.

Hast Du eine Idee für mich ?

Ciao
Don Pasquale
Titel: Re:XML Datei generieren
Beitrag von: Hevelmann am 03.09.03 - 10:45:06
Hi Don,

soll der Export nur für jeweils ein Dokument erfolgen oder für alle in der View ?

Gruss Hevelmann
Titel: Re:XML Datei generieren
Beitrag von: Axel Janssen temp am 03.09.03 - 10:48:21
was heisst von Hand?

Der einfachste Weg in Domino/LotusScript ist IMHO:

1. Schritt: Datei im Filesystem erzeugen.
2. Schritt: xml-Header + öffnenden root-Tag in Datei schreiben:
Code
<?xml version='1.0' encoding='UTF-8'?>
<MAIL>
3. Schritt: Einzelne Felder aus Notes-Dokument auslesen. (bekanntes doc.ItemName(0)) und in das xml-file schreiben:
"<Name>" + doc.Name(0) + "</Name>" in xml file schreiben.
4. Schritt: Root-tag schliessen:
Code
</MAIL>

5. Schritt: XML - file schliessen.

Notes bietet die 2 Standard APIs an. Dom und Sax. Mit Sax kannst du keine Dokumente schreiben sondern nur lesen (gilt für alle SAX-Implementierungen, nicht Domino spezifisch). Mit Dom ginge es, ist aber relativ aufwendig. In xml-Welt benutzt man immer stärker Dinge, die auf einem höheren Abstraktionslevel ansetzen und somit einfacher sind. Z.B. JDOM.

Tipp: benutze nicht encoding="UTF-8" sondern "ISO-8859-1". Mit UTF-8 gibt es Probleme mit europäischen Sonderzeichen wie deutschen Umlauten oder spanischen enjes. Warum das so ist hab ich auch noch nicht so richtig verstanden.  

Gruß Axel
 
Titel: Re:XML Datei generieren
Beitrag von: Hevelmann am 03.09.03 - 11:06:47
Ich habe einen ganz anderen Ansatz.

Ich arbeite mit XSL StyleSheets und  mit den Klassen NotesDXLExporter und NotesXSLTransformer. Soll heißen ich hab eine View mit einem Doc, indem der XSL StyleSheet steht. Mein Agent holt sich den Inhalt ( XSLstyleSheet ) und packt den in einen NotesStream dann hole ich das Notesdokument (Auto) und lade es per NotesDXLExporter auch in einen NotesStream. Dann erstelle ich einen dritten Stream (für Export ins Filesystem). Mit der Transformerklasse wandle ich also Stream1 (Auto) mit Hilfe von Stream2 (XSL SyleSheet) in Stream3 (Filesystem) um.

Ich weiss alles etwas kompliziert. Ich hab Dir mal schnell ne DB erstellt, die Dir die ganze Geschichte erklären kann.

Schau Sie Dir einfach mal an.

Im Dokument (Car.xsl) zu finden in der View XSL StyleSheet findest Du den XSL StyleSheet. Du musst, den roten Eintrag (Cars) entsprechend umbennen. Also in den Feldnamen, der Deine Fahrzeugbeschreibungen enthält.

Dann dürfte alles klappen.

Im Moment werden die ganzen xml Dateien, die Du erstellst unter C:/Temp abgelegt.

Schaus Dir halt mal an.

Gruss Hevelmann
Titel: Re:XML Datei generieren
Beitrag von: Don Pasquale am 03.09.03 - 11:19:32
@Hevelmann

Ja, alle Dokumente aus einer Sicht

@Axel J temp

Danke für den Tipp, aber genau dass ist ja der Clou,
ich muss die Dokumente in UTF-8 bringen und deswegen
wäre mir eine NotesKlasse lieber auf die Ich zugreifen kann.
Bisher benutze ich eine eigene Funktion string2xml
die mir die Sonderzeichen wie
& in &szlig; konvertiert.
Ich habe nur die befürchtung, mir könnte ein Sonderzeichen durch die Lappen gegangen sein.
Das ist mein bisheriger Code ( nur ein Auszug)
Er funktioniert und darüber soll hier keine Diskussion stattfinden.
Ich hätte gerne, dass Lotus mir die UTF-8 konformität abnimmt.
geht das irgendwie mit Lotus 6 LotusScript Klassen ?

Ciao
Don Pasquale

Dim REGISTERNAME As String
Dim ABLAGEVERZEICHNIS As String
Dim STICHWORT As Variant
Dim ws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = ws.CurrentDocument    
Dim session As New NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument  

Set db = session.CurrentDatabase  
Dim user As String  
  
user = session.UserName        
Set profildoc = db.GetProfileDocument( "e4frm_DBProfil" )
ABLAGEVERZEICHNIS = profildoc.e4profil_CeArcDir(0)
Pfad$ = ABLAGEVERZEICHNIS + "\docinfo.xml"
  
  
Set db = session.CurrentDatabase
Set doc = db.GetDocumentByUNID(unid)
  
  
If Not doc Is Nothing Then
      
temp=Freefile()
Open Pfad$ For Output  As temp
      
Print #temp,"<?xml version='1.0' encoding='ISO-8859-1'?>"
Print #temp,"<e4IHK>"
Print #temp,"<TABLE>" + "FIRMENAKTE"
Call Column(temp, "DOC_DATUM",doc.e4ihk_DOC_DATUM(0),"Date")
Call Column(temp,"EXTENDED_ATTR2",doc.e4ihk_EXTENDED_ATTR2(0),"String")      

...... ( weitere Felder )

Print #temp,"</TABLE>"
Print #temp,"</e4IHK>"
Close temp


Sub COLUMN (temp As Variant, CName As String, CValue As  String, CType As String)
  
   ' FUNKTION COLUMN
   ' Don Pasquale
   ' 22.01.2003
  
   CValue = string2xml(CVALUE)
  
   Print #temp,"<COLUMN>"
   Print #temp,"<NAME>" & CNAME & "</NAME>"
   Print #temp,"<VALUE>" & CValue & "</VALUE>"
   Print #temp,"<TYPE>" & CType & "</TYPE>"
   Print #temp,"</COLUMN>"
  
End Sub


Public Function string2xml(Byval strWert As String) As String
  
  
   On Error Resume Next
  
'    # Maskieren von Sonderzeichen (HTML-Konform) zum Schreiben in die XML-Datei
   strWert = ReplaceSubstring(strWert, "&", "&amp;")
   strWert = ReplaceSubstring(strWert, "<", "&lt;")
   strWert = ReplaceSubstring(strWert, ">", "&gt;")
   strWert = ReplaceSubstring(strWert, Chr$(34), "&quot;")
   string2xml = ReplaceSubstring(strWert, "'", "&apos;")
End Function
  

Titel: Re:XML Datei generieren
Beitrag von: Don Pasquale am 03.09.03 - 11:31:17
@Hevelmann

Bingo !

Das ist es was ich suche. Ich habe zwar noch nicht verstanden wie das funktioniert und wo ich anfangen soll, aber immerhin es gibt einen Weg. Vielen Dank.

Wie erstelle ich denn nun die XSL Datei, woher weiss Lotus, welches Feld zu welchem tag gehört ?

Ciao
Don Pasquale
Titel: Re:XML Datei generieren
Beitrag von: Hevelmann am 03.09.03 - 12:05:35
mit dem Exporter erstellst Du ein XML Dokument, das so aussehen kann:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE document SYSTEM 'xmlschemas/domino_6_0.dtd'>
<document xmlns="http://www.lotus.com/dxl" version="6.0" replicaid="C1256D9600262909" form="fmCars">
   <noteinfo noteid="8f6" unid="6C242E2FABB94DD9C1256D9600267984" sequence="1">
      <created>
         <datetime dst="true">20030903T090014,76+02</datetime>
      </created>
      <modified>
         <datetime dst="true">20030903T090021,59+02</datetime>
      </modified>
      <revised>
         <datetime dst="true">20030903T090021,58+02</datetime>
      </revised>
      <lastaccessed>
         <datetime dst="true">20030903T090021,58+02</datetime>
      </lastaccessed>
      <addedtofile>
         <datetime dst="true">20030903T090021,58+02</datetime>
      </addedtofile>
   </noteinfo>
   <updatedby>
      <name>CN=Max Mustermann/O=Musterfirma/C=DE</name>
   </updatedby>
   <item name="Cars">
      <text>VW Käfer</text>
   </item>
</document>


Dieses Dokument wird also in den Stream (streamin) geschrieben
(Set exporter = session.CreateDXLExporter ( nDoc, streamin )
Call exporter.process ()


nDoc ist Dein Dokument mit den Autos.

Mittels der Transformerklasse
(Set transformer = session.CreateXSLTransformer ( streamin, streamXSL, streamOut )
Call transformer.Process ()
)

wird also das erstellte XML Dokument (Autos) mit Hilfe des Stylesheets (wurde in streamXSL geladen) in deine Ausgabedatei umgewandelt. Dabei wird mit Hilfe des Stylesheets geschaut, ob es im XMLDokument (Autos) ein Tag "item" mit dem Attribut "Names" und dem Wert "Cars" gibt (<item name="Cars"><text>VW Käfer</text></item>), wenn es das gibt wird der Wert, den das Tag enthält in das neu zu erstellende xml Dokument geschrieben.

Mit Hilfe des Sylesheets wird also Dein Ausgangsdokument entsprechend Deiner Vorgaben umgewandelt.

Am besten Du ziehst Dir mal XMLSpy von http://www.xmlspy.com/. Dann kopierst Du den Code vom XML Dokument ( siehe oben ) und erstellst Dir ein neues XML Dok. auf der Platte. Das gleiche machst Du mit dem StyleSheet aus der Datenbank (Endung muss .xsl lauten). Öffne das erstellte XML Doc in XMLSpy. Im Menüpunkt View stelle auf TextView um un Drück F11, so kommst Du in den DebugModus. Lade jetzt Dein Stylesheet. Mit F11 kannst Du jetzt Schritt für Schritt durch den Code gehen. Im rechten Fenster (Output) wird Dein Ergebnis zusammengebaut.

Zitat
Wie erstelle ich denn nun die XSL Datei,

Erstellen kannst Du sie mit xmlSpy.

Zitat
woher weiss Lotus, welches Feld zu welchem tag gehört ?

das weiss Lotus nicht, das wird durch den StyleSheet erledigt.

Gruss Hevelmann
Titel: Re:XML Datei generieren
Beitrag von: Don Pasquale am 03.09.03 - 13:54:16
@Hevelmann
Ich taste mich ganz langsam ran.
Ich habe da aber auch Multivaluefelder. Hast Du eine Idee wie man daraus jeweils einen Tag macht ?

Ciao
Don Pasquale
Titel: Re:XML Datei generieren
Beitrag von: Axel Janssen temp am 03.09.03 - 14:12:04
@Hevelmann: Danke für den Tipp für die xslt transformation.
So ist das wirklich einfach. Bleibt noch das kleine Problem xslt zu schreiben.

XML-Spy ist relativ teuer.
Vielleicht für IBM Business Partner/Kunden interessant: WebSphere Application Developer hat auch einen xslt debugger und andere Tools, die in der 5er Version recht gut sind. Sämtliche open Source Tools für xml/xslt Entwicklung haben mich bislang noch nicht wirklich überzeugt.

Gruß Axel
Titel: Re:XML Datei generieren
Beitrag von: Hevelmann am 03.09.03 - 14:21:42
Notes macht daraus beim Export einen entsprechenden Tag ( hier rot )

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE document SYSTEM 'xmlschemas/domino_6_0.dtd'>
<document xmlns="http://www.lotus.com/dxl" version="6.0" replicaid="C1256D9600262909" form="fmCars">
   <noteinfo noteid="90e" unid="AB3799AF86A0346FC1256D9600431AC5" sequence="1">
      <created>
         <datetime dst="true">20030903T141257,65+02</datetime>
      </created>
      <modified>
         <datetime dst="true">20030903T141301,74+02</datetime>
      </modified>
      <revised>
         <datetime dst="true">20030903T141301,73+02</datetime>
      </revised>
      <lastaccessed>
         <datetime dst="true">20030903T141301,73+02</datetime>
      </lastaccessed>
      <addedtofile>
         <datetime dst="true">20030903T141301,73+02</datetime>
      </addedtofile>
   </noteinfo>
   <updatedby>
      <name>CN=Max Mustermann/O=Musterfirma/C=DE</name>
   </updatedby>

   <item name="Cars">
      <textlist>
         <text>VW Käfer</text>
         <text>VWGolf</text>
      </textlist>
   </item>

</document>


Was soll den mit der Textliste passieren ?

Gruss Hevelmann
Titel: Re:XML Datei generieren
Beitrag von: Don Pasquale am 03.09.03 - 14:30:36
@Hevelmann

bei mir macht es dass noch nicht, was aber daran liegt, dass ich Dein Beispiel aufgebohrt habe und nicht Deiner Anleitung gefolgt bin
 :-\

Die so generierten XML Dateien werden anderswo, ausserhalb Notes weiterverarbeitet und dann auf WORM gebrannt.

Wie muß denn der XSL Eintrag für Multivalue Felder aussehen ?

Ciao

Don Pasquale
Titel: Re:XML Datei generieren
Beitrag von: Hevelmann am 03.09.03 - 14:43:29
@Don Pasquale
Zitat
Wie muß denn der XSL Eintrag für Multivalue Felder aussehen ?

Das kommt drauf an, wie Deine Multivaluefelder im zu erstellenden XML Dokument aussehen sollen.

@Axel

Ja xsl ist knackig, ich hab mich wärend meines Praktikums lang damit rumgeschlagen. Der hier von mir gepostete StyleSheet ist bestimmt auch nicht das gelbe vom Ei aber er erfüllt seinen Zweck.

Du hast recht xmlSpy ist ziemlich teuer aber halt auch verdammt gut. Das sollte man wirklich nur kaufen, wenn man es unbedingt braucht. Ich habs auch nur hier gepostet, weils da ne 30Tage Version zum üben gibt

Gruss Hevelmann
Titel: Re:XML Datei generieren
Beitrag von: Don Pasquale am 03.09.03 - 14:59:22
@Hevelmann
Ich verstehe Deine Frage nicht richtig. Als Beispiel habe ich das Feld

SendTo(0) aus der Form MEMO

Entweder mache ich daraus 1 Tag mit vielen Einträgen oder viele einzelen Einträge Oder wie meintest Du das ?


<item name = "Empfaenger">
<textlist>
<text>hinz</text>
<text>kunz</text>
</textlist>
</item>

oder

<item name = "Empfaenger">
<text>kunz</text>
</item>
<item name = "Empfaenger">
<text>hinz</text>
</textlist>
</item>


Titel: Re:XML Datei generieren
Beitrag von: Hevelmann am 03.09.03 - 15:23:01
Also ich glaube wir reden gerade etwas aneinander vorbei.  :-[

Also mit der Exporterklasse kannst Du ein xml-Dokument aus einem Notesdokument erstellen. Das XML-Dokument ist ein Abbild des Notesdokumentes, in Textform. (XML ist nichts anderes als Text) Notes generiert den XML-Code nach seinen Vorgaben ( stehen in einer dtd ), dass heisst also Du ein Notesdokument direkt exportierst (ohne Transformatorklasse) kommt immer sowas ähnliches raus (jenachdem was das Notesdokument enthält:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE document SYSTEM 'xmlschemas/domino_6_0.dtd'>
<document xmlns="http://www.lotus.com/dxl" version="6.0" replicaid="C1256D9600262909" form="fmCars">
   <noteinfo noteid="90e" unid="AB3799AF86A0346FC1256D9600431AC5" sequence="1">
      <created>
         <datetime dst="true">20030903T141257,65+02</datetime>
      </created>
      <modified>
         <datetime dst="true">20030903T141301,74+02</datetime>
      </modified>
      <revised>
         <datetime dst="true">20030903T141301,73+02</datetime>
      </revised>
      <lastaccessed>
         <datetime dst="true">20030903T141301,73+02</datetime>
      </lastaccessed>
      <addedtofile>
         <datetime dst="true">20030903T141301,73+02</datetime>
      </addedtofile>
   </noteinfo>
   <updatedby>
      <name>CN=MAx Mustermann/O=Musterfirma/C=DE</name>
   </updatedby>
   <item name="Cars">
      <textlist>
         <text>VW Käfer</text>
         <text>VWGolf</text>
      </textlist>
   </item>
</document>


Diese Code sagt zum Beispiel:

- das Dokument kommt aus einer 6er Version, die Datenbank hat die Replicaid: C1256D9600262909, die Maske, mit der das Dokument erstellt wurde heisst "fmCars"

<document xmlns="http://www.lotus.com/dxl" version="6.0" replicaid="C1256D9600262909" form="fmCars">

- weiterhin hat das Notesdokument die Notesid: "90e", die UNid : "AB3799AF86A0346FC1256D9600431AC5"

<noteinfo noteid="90e" unid="AB3799AF86A0346FC1256D9600431AC5" sequence="1">

-dann kommen die ganzen Angaben zur Erstellung, letzte Änderung usw.:

   <created>
         <datetime dst="true">20030903T141257,65+02</datetime>
      </created>
      <modified>
         <datetime dst="true">20030903T141301,74+02</datetime>
      </modified>
      <revised>
         <datetime dst="true">20030903T141301,73+02</datetime>
      </revised>
      <lastaccessed>
         <datetime dst="true">20030903T141301,73+02</datetime>
      </lastaccessed>
      <addedtofile>
         <datetime dst="true">20030903T141301,73+02</datetime>
      </addedtofile>


- dann kommt noch der Name:

   <updatedby>
      <name>CN=MAx Mustermann/O=Musterfirma/C=DE</name>
   </updatedby>


- und zum Schluss kommt mein Feld

<item name="Cars">
      <textlist>
         <text>VW Käfer</text>
         <text>VWGolf</text>
      </textlist>
   </item>


Ist halt ein Dokument, in dem nicht viel drin steht.

Wenn Du das Dokument so lässt wie es ist kannst Du es auch wieder in Notes importieren.

Du willst doch aber ein XML-File erstellen, dass mit WORM weiter verarbeitet werden kann. Damit WORM mit einem XLM-File was anfangen kann muss es gewissen Kriterien entsprechen. So und jetzt kommt er StyleSheet zum Einsatz. Mit dem baust Du Dir die Informationen so zusammen, dass WORM was damit anfangen kann. Die eigentlichen Informationen (z.B. VW Käfer) bleiben doch die gleichen Du verpackst sie halt nur etwas anders. Deshalb ist es wichtig zu wissen, wie die Daten aufbereitet werden müssen, damit WORM was damit anfangen kann.

Gruss Hevelmann
Titel: Re:XML Datei generieren
Beitrag von: Don Pasquale am 03.09.03 - 15:42:00
@Hevelmann

Danke dass Du am Ball bleibst. Ich kann mir vorstellen dass das Nerven kostet.

Ich benötige nicht unbedingt eine 1:1 Umsetzung des Lotus Dokumentes in XML, es müssen nicht alle Felder erfasst werden.
Die Feinheiten des Formates darf ich selbst bestimmen, die
anderen Entwickler stellen sich dann darauf ein.

Das Beispiel mit dem Auto war nur eine Hausnummer,
eigentlich benötige ich  aus der Form Memo die Felder

From
SendTo 1 -n
Subject
Body
und die Namen der Embedded Attachment. 1-n

So dachte ich sollte das dann aussehen

< utf 8 blah blah >

<MAIL>
<ITEM>
<NAME>ABSENDER</NAME>
<VALUE>ich@zuhause.de</Value>
</ITEM>

<ITEM>
<NAME>EMPFAENGER</NAME>
<VALUE>du@beiDir.de</Value>
<VALUE>er@beiihm.de</Value>
</ITEM>

<ITEM>
<NAME>TITEL</NAME>
<VALUE>Inhalt des Subjects</Value>
</ITEM>

<ITEM>
<NAME>BODY</NAME>
<VALUE>Inhalt des Feldes Body</Value>
</ITEM>

<ITEM>
<NAME>ATTACHMENTS</NAME>
<VALUE>NAME DES 1. ATTACHMENTs</Value>
<VALUE>NAME DES 2. ATTACHMENTs</Value>
<VALUE>NAME DES 3. ATTACHMENTs</Value>
</ITEM>

</MAIL>

Eine WORM ist u.a. eine 5.2 GB große CD-ROM auf die
nur geschrieben werden kann.


Deine Tipps brachten mich schon gut in die richtige Richtung.
Problematisch ist hat noch die Konvertierung des Rich Text Feldes Body und die Multi Values von SendTo.

Ciao
Don Pasquale


Titel: Re:XML Datei generieren
Beitrag von: Hevelmann am 03.09.03 - 16:16:11
Also ich würde die ganze Sache eher so aufbauen:

<MAIL>
   <ITEM name="absender">
      <VALUE>ich@zuhause.de</Value>
   </ITEM>

   <ITEM name="empfänger">
      <List>
         <VALUE>du@beiDir.de</Value>
         <VALUE>er@beiihm.de</Value>
      </List>
   </ITEM>

   <ITEM name="Title">
      <VALUE>Inhalt des Subjects</Value>
   </ITEM>

   <ITEM name="body">
      <VALUE>Inhalt des Feldes Body</Value>
   </ITEM>

   <ITEM name="attachment">
      <List>
         <VALUE>NAME DES 1. ATTACHMENTs</Value>
         <VALUE>NAME DES 2. ATTACHMENTs</Value>
         <VALUE>NAME DES 3. ATTACHMENTs</Value>
      </List>
   </ITEM>
</MAIL>


Dann fehlt jetzt eigentlich nur noch der StyleSheet, der das hinbekommt.

Also das wird nicht ganz einfach, ich habs bisher immer so gemacht, dass ich mir ein XML Dokument des entsprechenden Dokumentes ( hier also ein Mail mit Attachments usw.) erstellt habe und dann mit xmlSpy ( oder welchem Programm auch immer) den passenden XSL StyleSheet zusammen gebaut habe.

Der Agent "export" erstellt vom ersten Dokument in einer View ein XML Dokument. Du musst ihn halt nur entsprechend anpassen. Den hab ich aus der NotesHilfe und er ist nicht wirklich schön, aber er macht genau das.

Wenn Du das xml-Dok hast schick es mir doch mal, mal sehen was man da machen kann.

Hier mal eine Seite, die mir immer hilfreich war. http://www.xsl-rp.de/


Gruss Hevelmann
Titel: Re:XML Datei generieren
Beitrag von: Axel Janssen temp am 03.09.03 - 16:20:30
... das Thema habe ich leider erst noch vor mir...

und @Don

Die einfachste Ressource ist http://www.w3schools.com/
die 2. einfachste http://www.zvon.org
Titel: Re:XML Datei generieren
Beitrag von: Hevelmann am 04.09.03 - 18:27:17
@ Don Pasquale

So hier ein Anfang der funktionieren müsste:


<?xml version="1.0"?>
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:dxl="http://www.lotus.com/dxl" exclude-result-prefixes="dxl">
   <xsl:output method="xml" indent="yes" encoding="UTF-8" omit-xml-declaration="no" version="1.0"/>

   <xsl:template match="/">
      <xsl:apply-templates select="dxl:document"/>
   </xsl:template>

   <xsl:template match="dxl:document">
      <MAIL>
         <COLUMN>
            <xsl:call-template name="GetValue"/>
            <TYPE>String</TYPE>
         </COLUMN>
      </MAIL>
   </xsl:template>

   <xsl:template name="GetValue">
      <xsl:for-each select="dxl:item">
         <xsl:choose>
            <xsl:when test="@name='From'">
               <item>
                  <xsl:attribute name="name">Absender</xsl:attribute>
                  <value>
                     <xsl:value-of select="."/>
                  </value>
               </item>
            </xsl:when>
         </xsl:choose>

         <xsl:choose>
            <xsl:when test="@name='Subject'">
               <item>
                  <xsl:attribute name="name">Titel</xsl:attribute>
                  <value>
                     <xsl:value-of select="."/>
                  </value>
               </item>
            </xsl:when>
         </xsl:choose>
         
         <xsl:choose>
            <xsl:when test="@name='Body'">
               <item>
                  <xsl:attribute name="name">Body</xsl:attribute>
                  <Value>
                     <xsl:for-each select="dxl:richtext/descendant::*">
                        <xsl:choose>
                           <xsl:when test="text()">
                              <xsl:choose>
                                 <xsl:when test="name()='formula'"></xsl:when>
                                 <xsl:when test="name()='notesbitmap'"></xsl:when>
                                 <xsl:otherwise><xsl:value-of select="text()"/></xsl:otherwise>
                              </xsl:choose>
                           </xsl:when>
                        </xsl:choose>
                     </xsl:for-each>
                  </Value>
               </item>
            </xsl:when>
         </xsl:choose>

         <xsl:choose>
            <xsl:when test="@name='SendTo'">
               <item>
                  <xsl:attribute name="name">Emfpänger</xsl:attribute>
                  <xsl:for-each select="dxl:textlist/dxl:text">
                     <xsl:choose>
                        <xsl:when test="following-sibling::*">
                           <Value>
                              <xsl:value-of select="text()"/>
                           </Value>
                        </xsl:when>
                        <xsl:when test="self::*">
                           <Value>
                              <xsl:value-of select="text()"/>
                           </Value>
                        </xsl:when>
                     </xsl:choose>
                  </xsl:for-each>
               </item>
            </xsl:when>
         </xsl:choose>

      </xsl:for-each>   
   </xsl:template>
</xsl:transform>



Die Sache mit den Attachment Namen funktioniert noch nicht, aber ich bleib am Ball

Gruss Hevelmann
Titel: Re: XML Datei generieren
Beitrag von: CourtJester am 14.09.05 - 18:56:56
Hi,

Auch wenn ich mit dieser Frage wahrscheinlich die ganze Breite meines Unwissens bzgl. xml dokumentiere:

Hat Jemand eine Idee, wie ich an dieses "Stylesheet" dazu bringe statt dem Attribut:  "ÄÖÜName" "ss:Name" auszugeben?
Der Doppelpunkt ist halt das Problem!
Sind so die ersten Versuche eine Exceltabelle per xml zu füllen.

<?xml version="1.0"?>
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:dxl="http://www.lotus.com/dxl" exclude-result-prefixes="dxl">
        <xsl:output method="xml" indent="yes" encoding="UTF-8" omit-xml-declaration="no"/>
        <xsl:template match="/">
                <xsl:apply-templates select="dxl:document"/>
        </xsl:template>
        <xsl:template match="dxl:document">
   <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
       xmlns:o="urn:schemas-microsoft-com:office:office"
       xmlns:x="urn:schemas-microsoft-com:office:excel"
       xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
       xmlns:html="http://www.w3.org/TR/REC-html40">
                  <xsl:call-template name="GetValue"/>
                  
   </Workbook>
     </xsl:template>
       
       <xsl:template name="GetValue">
                <xsl:for-each select="dxl:item">
                        <xsl:choose>
                                <xsl:when test="@name='Cars'">
              <xsl:element name="Worksheet">
                 <xsl:attribute name = "ÄÖÜName">
                         <xsl:value-of select="*"/>
                 </xsl:attribute>
               </xsl:element>
                                </xsl:when>
                        </xsl:choose>
                </xsl:for-each>
        </xsl:template>
 </xsl:transform>


Vielen Dank schonmal.

Jester
Titel: Re: XML Datei generieren
Beitrag von: flaite am 14.09.05 - 21:00:13
länger nicht mehr mit xslt gearbeitet, aber der Doppelpunkt wie du sagst ist ein namespace. Oder vielleicht besser gesagt ein namespace qualifier.
Ich frag mich jetzt, ob das überhaupt in xslt1.0 unterstützt wird.
Hier wird ein workaround vorgeschlagen:
http://www.xslt.com/html/xsl-list/2005-03/msg01105.html

oder hier:
http://www.xml.com/pub/a/2001/04/04/trxml/

Titel: Re: XML Datei generieren
Beitrag von: flaite am 14.09.05 - 21:13:42
Code

<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:dxl="http://www.lotus.com/dxl"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
 exclude-result-prefixes="dxl"> 

Versuch auch mal den Namespace identifier oder wie das heisst (ich meine das ss) wie oben in dem Root-Tag des xsls zu deklarieren.

Vielleicht hilft auch das:
exclude-result-prefixes
Titel: Re: XML Datei generieren
Beitrag von: CourtJester am 15.09.05 - 07:50:05
Hi,

Wow, vielen Dank!
Ich habe gestern ungefähr 50 mal versucht über verschiedene abenteuerliche Konstruktionen, mit und ohne Deklaration im Transform Tag, den Übersetzer dazu zu bringen das ss:Name auszuspucken.
Irgendwie muß ich wohl den Überblick verloren haben (Wie so häufig, wenn man eigentlich nicht so genau weiß was man tut), denn heute hat die Deklaration auf Anhieb ausgereicht:

...
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"   xmlns:dxl="http://www.lotus.com/dxl" exclude-result-prefixes="dxl">
...

Das Ergebnis ist schon jetzt eine (bisher leere) exellesbare und über zusätzliche tag's formatierbare (sonst würde csv ja reichen) Tabelle.
Ich bin vollauf begeistert (merkt man wahrscheinlich).
Statt irgendwelche Library's einzubinden und für jedes Produkt eine eigene Subroutine zu schaffen, kann man Tabellen, Worddokumente und FDF's einfach mit derselben Routine, durch auswählen eines passenden Stylesheets schreiben.

Dann werde ich den Kram 'mal in mein eigentliches Projekt einbauen.

Vielen Dank nochmal.


Jester
Titel: Re: XML Datei generieren
Beitrag von: flaite am 15.09.05 - 11:01:09
 8)
Cool. Ich mag Fragensteller, bei denen man nur ein paar Anregungen geben muß und schnipps ist das Ergebnis da.
Namespaces sorgen in xml allgemein des öfteren für Kopfkratzen.

Gruß Axel
Titel: Re: XML Datei generieren
Beitrag von: CourtJester am 16.09.05 - 08:00:21
ARgh! Zu früh gefreut.

So im richtigen Leben, sieht es doch meißt wieder anders aus:

Losgelassen auf meine richtigen "Targets", habe ich ein Dokument bei dem die Transformation mit "XSL transform operation failed" abbricht.
Bisher habe ich noch nichts anders gemacht als dort oben und einige verschiedene ExcelTabellen in verschiedenen Files, mit einer Laufnummer als Namen generiert.
Bei genau diesem einen Dokument steigt die Routine aus, komischerweise NACHDEM (!) sie das File mit den (verwertbaren!) Informationen schon geschrieben hat.

Das Platzieren an verschiedene Stellen in der View (Laufnummer verändert), zeigt mir das es auch tatsächlich am Dokument liegt, denn egal wo es sich befindet, bricht das Script immer bei diesem Dokument ab.

Zunächst schätzte ich die Größe des Dokumentes (4,4MB) als Problem ein, jedoch auch nachdem ich sämtliche Attachments gelöst hatte und sich der Umfang mit ca 200kB in einer Größenordnung befand in der andere Dok's problemlos durchlaufen, brach die Transformation wieder mit diesem Dok ab.

Ich schätze, das verpasst diesem Projekt erst einmal den Todesstoß, da ich das Ergebnis natürlich auch mit "normalen" Fileoperationen hinbekomme und im Geschäftsleben eben nur das kurzfristig erreichbare Ergebnis zählt (Ganz egal wie viele Generationen an nachfolgenden Programmierern mit einem Tick mehr "Grundlagenforschung" tausende von Euros wieder einsparen).

Wenn allerdings Jemand eine spontane Idee (die sich leicht verifizieren lässt) hätte, wäre ich natürlich dankbar.
Leider kann ich das Originaldokument aber nicht für Versuche zur Verfügung stellen.

Gruß Jester (Markus)
Titel: Re: XML Datei generieren
Beitrag von: Christopher am 27.02.07 - 13:48:17
@Hevelmann

bin heute mal auf Dein Beispiel gestoßen und finde es richtig gut ich beschäftige mich seit kurzem mit XML. Gibt es auch die Möglichkeit einen Anhang zu übergeben also Dateiname Dateianhang usw.

mit dem DXL importer und exporter scheint das ja zu gehen wie warum usw. habe ich aber noch nicht verstanden...
Titel: Re: XML Datei generieren
Beitrag von: Hevelmann am 27.02.07 - 16:28:38
@Hevelmann

bin heute mal auf Dein Beispiel gestoßen und finde es richtig gut ich beschäftige mich seit kurzem mit XML. Gibt es auch die Möglichkeit einen Anhang zu übergeben also Dateiname Dateianhang usw.

mit dem DXL importer und exporter scheint das ja zu gehen wie warum usw. habe ich aber noch nicht verstanden...


hui das ist ja schon 3 1/2 jahre her. wie die zeit doch vergeht.

@Christopher: was genau hast du denn vor?
Titel: Re: XML Datei generieren
Beitrag von: Christopher am 27.02.07 - 16:32:34
ja die zeit vergeht immer so verdammt schnell  ;D

Ich will einfach eine Email als XML Dateiexportieren und so evlt. eine archiv lösung bauen oder wo man auf die Daten mit anderen Tools wieder zugreifen kann.
Titel: Re: XML Datei generieren
Beitrag von: Hevelmann am 27.02.07 - 17:07:03
ok, mittels der exporter klasse, exportierst du die mail in eine datei. alle angänge der email werden base64 encoded dargestellt, so dass du auch mit anderen tools darauf zugreifen/umwandeln kannst.

hier mal ein auszug aus einen base64 encoded Anhang:

Code
lQAmAAAAAAAAAAAAAAABAAAAAAAAAHgAJQAIAAEACAABAIUAAwCWABkKAAAAAAAAAAAAACUABwpA
BADCAAEPxAAFQmEGOnRACQDEAEAEAMYACTokAgYhSXQAEkAJAAEAQAQAxQAEdAYCBsICBSQ6DwAQ
QAkAQAQAxAAFGFsoBgLCBgMhSg9ACQDCAEAEAMUAAVDDAsIGAyQ6D0AJAMIAQAQAxgACOiTCAgUo
BlAAEkAJAAEAQAQAxADCEAYTOkpJSnnCAAFuyAADDwAPQAcAxgBABADDAAMTABPCUAd3QltQWQ8S
xAAEDxgAWcJQBXlwMgATQAcAwgBABADFAAITBsICwgYDJDoPxgAEW4RJIsJKATtAAgABEMUAARBA
AgDDAMMYARDPAEAEAMUAAhNhwgLCBgMkOg/EAAYTOiQoIWHCOwF/QAIAxgABD0ACAMIAAXPDfAJ2
D84AQAQAxQACEyLCAsIGAyQ6GMQAAjokwwIBBsJKAjsQwgUEDzJPBUAEAAkAGDdRQ1FGEA/NAEAE
AMUAAhMiwwIEBiE7GMMAA3AGAsIGDQIGAiQ7DxdAFTBoCgVAAgDEAAETywAHEC4JBAlGEM4AQAQA
xQACEyLDAgQGITsYwgADGHkhwgYCAgbDAglyRQFFQGURYw1AAwABAMQQwwAHEDcJBAlGD8QAARPJ ...

die frage ist halt, ob das für ein archiv sinnvoll ist, da base64 encodierte dateien ca. 30% mehr speicherplatz benötigen, als originaldateien.
Titel: Re: XML Datei generieren
Beitrag von: flaite am 27.02.07 - 17:15:14
Seit letzten Jahr benutzt man MTOM (ist ein W3C-Standard).
z.B.: http://xfire.codehaus.org/MTOM
Zitat
MTOM is a way to handle large amounts of binary data in your services. Unlike attachments, the XML infoset stays the same. MTOM just "optimizes" any base64Binary data you have in your messages. When MTOM is turned on, this base64 data gets sent as a binary attachment saving time and space.
Microsoft und andere sind da auch sehr aktiv hinsichtlich der Unterstützung.
Braucht weniger Speicher als Base64. Bis das aber in NotesXML eingebaut wird... Das kann dauern.
Vielleicht ist aber der größere Speicherbedarf gar nicht so ein großes Problem, weil Archiv-Speicher auch nicht mehr soooo teuer ist und in existierenden Archiven sowieso viel base64encoded rumliegt.

Gruß Axel 
Titel: Re: XML Datei generieren
Beitrag von: jtuemmer am 28.02.07 - 07:47:11
@Havelmann:

Zitat: "ok, mittels der exporter klasse, exportierst du die mail in eine datei. alle angänge der email werden base64 encoded dargestellt, so dass du auch mit anderen tools darauf zugreifen/umwandeln kannst."

Grundsätzlich ist diese Aussage so richtig. Es ist allerdings Vorsicht geboten: Notes/DOMINO bietet nämlich die Möglichkeit, Anhänge am Server per default zu komprimieren. Die meisten der mir bekannten Notes/DOMINO Anwendern (Unternehmen) nutzen diese Option, um den Speicherbedarf einigermassen in den Griff zu bekommen. Wenn die Option zur Komprimierung der Attachments eingeschaltet ist, dann sind die Dateianhänge in dem vom DXL Exporter generierten XML zwar BASE64 kodiert, entscheidend ist aber, dass die BASE64 Kodierung auf den komprimierten Anhang und nicht auf den unkomprimierten Anhang engewendet wird. Der DXL Exporter dekomprimiert die Anhänge nicht, bevor er sie BASE64 kodiert und das Ergebnis dann in das XML Dokument packt.

Für die Kompression der Anhänge stehen zwei Algorithmen zur Auswahl: Huffman und LHZIP, wenn ich mich richtig erinnere. Und mindestens der aus Effizienzgründen sehr häufig benutzte Huffman Algorithmus ist nicht dokumentiert oder über eine API zugänglich. Das heisst dann im Klartext, dass Du die Dateianhänge in so generierten XML Dateien nie wieder lesen können wirst. Und das ist dann für die Archivierung nicht wirklich ein guter Ansatz ;-)


Jochen
Titel: Re: XML Datei generieren
Beitrag von: Christopher am 28.02.07 - 08:02:13
Mich würde jetzt erst mal interessieren wie ich einen solchen Anhang ach wenns BASE64 ist in ein XML Dokument über ein XSL exportieren kann.

Dann noch eine andere Frage wenn ich über die Exporter Klasse eine Email z.B. exportiere kann ich ja zum Teil auch nichts mehr mit anfangen oder? Da teilweise Betreff und Body Text auch Base64 kodiert zu scheinen.