phpbar.de logo

Mailinglisten-Archive

[php] DOM appendChild

[php] DOM appendChild

Andi Voss andi at andis.mine.nu
Mon Mar 26 15:07:30 CEST 2007


Hallo Peter,

erstmal danke für deine Antwort.

Peter Bieling wrote:
> Ich würde nach Möglichkeit auf den ganzen DOM-Kram verzichten, denn so 
> wie es aussieht holst Du ja nur ein Tabellenzeilen-Template aus der 
> XML-Datei, das Du dann füllen willst. 

Das stimmt teilweise. Ich möchte die Platzhalter füllen, aber eben auch 
die Tabellenzeile n mal vervielfältigen. Die Tabellenzeile steht nur 
einmal in der OpenOffice Vorlage und schaut entsprechend in der 
content.xml Datei so aus:

<table:table-row>
   <table:table-cell table:style-name="Table2.A2" 
office:value-type="string">
     <text:p text:style-name="P2">{NO. RECEIPTS}</text:p>
   </table:table-cell>
   <table:table-cell table:style-name="Table2.A2" 
office:value-type="string">
     <text:p text:style-name="P2">{DESCRIPTION RECEIPTS}</text:p>
   </table:table-cell>
   <table:table-cell table:style-name="Table2.A2" 
office:value-type="string">
     <text:p text:style-name="P2">{CATEGORY RECEIPTS}</text:p>
   </table:table-cell>
   <table:table-cell table:style-name="Table2.D2" 
office:value-type="string">
     <text:p text:style-name="P2">{RECEIPTS}<text:s/>{AMOUNT}</text:p>
   </table:table-cell>
</table:table-row>

Das heisst um die Tabellen-Zeile n-mal vervielfältigen zu können, muss 
ich die komplette <table:table-row>...</table:table-row> 
vervielfältigen. Das erreiche ich mit cloneNode und appendChild.
Die Anzahl der erforderlichen Tabellenzeilen kommen aus einer 
DB-Abfrage. Es sind die Belege, die zu einer Spesenabrechnung gehören.

Diese Tabellen-Zeile oben steht nur einmal in der .odt Vorlage und soll 
entsprechend der Anzahl der Belege vervielfältigt werden.

Das Ersetzen der Platzhalter funktioniert ja auch wunderbar, nur wenn 
ich diese Tabellenzeile jetzt 5 mal habe, dann steht auch z.B. 5 mal der 
Platzhalter {NO. RECEIPTS} in den zeilen.
Ersetze ich dann mit str_replace {NO. RECEIPTS} das erste Mal, sind ja 
alle Vorkommen von {NO. RECEIPTS} ersetzt und nicht nur das Erste.
Ich bräuchte sowas {NO. RECEIPTS}{$i} als Platzhalter und $i würde dann 
nach jedem Durchlauf hochgezählt, sodass ich dann {NO. RECEIPTS}{1}, 
{NO. RECEIPTS}{2} usw. habe.
So habe ich es auch schon versucht, aber $i wird halt nicht als Variable 
interpretiert.

> In XML-Dateien gehören ja 
> normalerweise Daten, während Templates in Template-Dateien gehören. ;-)
> (Ausnahme sind natürlich Templates im XML-Format, z.B. XSLT-Dateien aber 
> die bearbeitet man dann auch nicht mit str_replace.)

Ich hoffe nach meiner Beschreibung oben ist mein Problem jetzt klarer?

> Vielleicht erklärst Du mal genauer, was Du vor hast, und warum die 
> DOM-Funktionen Dir besonders geeignet erscheinen, Dein Problem zu lösen. 
> Kommt diese XML-Datei z.B. aus fremder Quelle, auf die Du keinen 
> Einfluss hast?
> So lange man den Sinn nicht versteht, fehlt auch ein bisschen die 
> Motivation, Dir zu helfen.

Die OpenOffice Datei ist eine Vorlage, die ich nicht beeinflussen kann 
und enthält unter anderem Platzhalter in einer Tabellenzeile, die 
beliebig oft dupliziert werden können muss (die Tabellenzeile) und dann 
jeweils mit anderen Daten gefüllt wird.
Es muss auch möglich sein, dass die OpenOffice Datei im Design und 
Layout angepasst werden kann, daher muss ich den DOM weg gehen, um alle 
Formatierungen der Nodes und ChildNodes usw. behalten zu können und 
flexibel zu bleiben.
Da es ja eine pure XML-Datei ist, die ich bearbeiten muss, denke ich 
dass DOM da schon der richtige Weg ist, es hakt halt nur gerade ein wenig...

Irgendwie tue ich mir schwer das Problem zu beschreiben, ich hoffe es 
ist jetzt klar geworden!?

Gruss
Andi




php::bar PHP Wiki   -   Listenarchive