[Velocity-word xml]Tabel verwerken

Pagina: 1
Acties:

  • J2pc
  • Registratie: Oktober 2002
  • Niet online

J2pc

UT Tux Edition

Topicstarter
Ik ben bezig met een java app waarmee Word-xml (office 2003) wordt ingelezen, en omgezet naar een velocity script. Dat script kan vervolgens gebruikt worden om uit een database documenten te genereren (denk aan facturen, offertes etc, standaard opmaak, custom inhoud).

Ik wil het programma gescheiden houden van het omzetten, omdat je anders met een nieuwe office, of een andere formaat van oplevering je hele java-code om moet gaan zetten. Daarom lees ik het (word)-xml bestand in naar een JDom object, wat vervolgens met enkele hulpclasses aan een velocity context gegeven wordt. Deze verwerkt dit document, en genereerd een velocity-script wat dynamisch een xml-document kan gaan genereren.

So far so good. Alleen nu loop ik tegen het probleem aan dat ik een tabel wil verwerken:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    #set ($XPath1 = $XmlHelper.NewXpath("child::w:tr")) ##Selecteerd rijen
    #set ($XPath2 = $XmlHelper.NewXpath("child::w:tc")) ##Selecteerd kolommen

    #set ($Rijen = $XPath1.selectNodes($tbl)) ##Selecteer de rijen in de tabel
    
    #foreach($Rij in $Rijen) ##loop de rijen door
        <rij>
        #set ($Kolommen = $XPath2.selectNodes($Rij)) ##Selecteer de komlommen in de rij, hier ziet hij na de eerste rij geen kolommen meer
        #foreach($Kolom in $Kolommen) loop de kolommen door, dit wordt daarom alleen de eerste keer gedaan, daarna is niks om doorheen te lopen.
            <kolom>
            #subsection($Kolom $XmlHelper true) ##Verwerk de inhoud van de kolom
            </kolom>
        #end
        </rij>
    #end


Ik gebruik XPath expressies om door het document te navigeren. Hier kom zit ik dus in een tabel (layout al gemaakt, breedtes omgezet en zo).

Het probleem is nu, dat alleen van de eerste rij de kolommen geselecteerd worden, dit gaat goed. Maar zodra hij naar de 2e rij gaat, vind hij geen kolommen meer. Er worden dus alleen nog lege
code:
1
2
<rij>
</rij>

tags aangemaakt.

In het kort de tabel in word-xml
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<w:tbl>
  ... opmaak babbel
  <w:tr>
    <w:tc>
           ... inhoud
    </w:tc>
    <w:tc>
           ... inhoud
    </w:tc>
  </w:tr>
  <w:tr>
      ....je bedoelt me wel
   </w:tr>
</w:tbl>


Wie kan me helpen.
Hij ziet dus alleen bij de eerste rij kolommen, hoewel er in iedere rij kolommen zijn.

/edit
Ik gebruik trouwens Jaxen voor de x-path expressies, en XmlHelper is een object met verschillende hulp-functies.

[ Voor 45% gewijzigd door J2pc op 23-06-2006 11:04 ]

"The computer is incredibly fast, accurate, and stupid. Man is unbelievably slow, inaccurate, and brilliant. The marriage of the two is a challenge and opportunity beyond imagination." © Stuart G. Walesh


  • J2pc
  • Registratie: Oktober 2002
  • Niet online

J2pc

UT Tux Edition

Topicstarter
Ok. Ik kreeg ineens een ingeving, en ging m'n code nog even doorzoeken. Ik had nog nergens geneste loops gebruikt (zou zweren van wel) maar alleen via een aanroep naar een volgende macro.
Ik roep nu voor iedere rij een macro aan die de kolommen ophaalt. En dat werkt wel

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    #set ($XPath1 = $XmlHelper.NewXpath("child::w:tr"))


    #set ($Rijen = $XPath1.selectNodes($tbl))
    
    #foreach($Rij in $Rijen)
        <rij>
            #Row ($Rij $XmlHelper)
        </rij>
    #end
    </tabel>
#end

#macro (Row $Row $XmlHelper)
        #set ($XPath2 = $XmlHelper.NewXpath("child::w:tc"))
        #set ($Kolommen = $XPath2.selectNodes($Row))

        #foreach($Kolom in $Kolommen)
            <kolom>
            #subsection($Kolom $XmlHelper true)
            </kolom>
        #end
#end


Het flauwe is dat hij die eerste rij wel goed deed, dat is verwarrend. Maar voor mensen met hetzelfde probleem, je kan dus geen loops nesten (Velocity 1.4)

"The computer is incredibly fast, accurate, and stupid. Man is unbelievably slow, inaccurate, and brilliant. The marriage of the two is a challenge and opportunity beyond imagination." © Stuart G. Walesh