[XML] Meerdere bronnen transformeren tot target

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Ram0n
  • Registratie: Maart 2002
  • Laatst online: 03-07 13:05

Ram0n

Bierbrouwende nerd

Topicstarter
Hey allemaal,

Ik ben al enige tijd bezig met een groot project waarbij de laatste stap bestaat uit het omzetten van een flatfile naar XML. Voor de beperkte proof-of-concept heb ik hiervoor een Java-tool geschreven die dit doet met handmatig ingevoerde XQuery-paden, maar voor de uiteindelijke applicatie moet hier uiteraard een wat robuustere oplossing voor gevonden worden.

Ik ben vooral aan het spelen met transformaties via XSL, maar stuit hierbij op het probleem dat er meerdere groepen values zijn in het bronbestand die telkens per groep een node moeten vormen van dezelfde sequence in het resulterende bestand.

In versimpelde vorm heb ik bijvoorbeeld dit stukje uitvoer:

XML:
1
2
3
4
5
(...)
<S1P1>Data1</S1P1>
<S1P2>Data2</S1P2>
<S1P3>Data3</S1P3>
(...)


Hiervoor en -achter staat nog allerlei andere data, maar het relevante hier is dat deze 3 regels output dezelfde soorten data representeren, maar met verschillende namen. Hoeveel het er worden staat niet vast, maar in de praktijk worden het er gegarandeerd maximaal 20. De namen zullen dan variëren van S1P1 tot S1P20.

Ik gebruik de XML Mapper mogelijkheid van JDeveloper om een XSL te ontwerpen, maar hierbij lijkt het niet mogelijk om meerdere source-nodes aan te wijzen als bronnen voor een type in de gewenste XSD.

Als output zou ik bijvoorbeeld het volgende willen hebben:

XML:
1
2
3
4
5
6
7
(...)
<S1>
  <text>data1</text>
  <text>data2</text>
  <text>data3</text>
</S1>
(...)


Ik krijg het gevoel dat ik wellicht totaal in de verkeerde richting zoek, maar diverse zoekopdrachten leveren niet de gewenste oplossing. Ik vraag me ook af wat ik als zoekopdracht moet gebruiken aangezien het probleem lastig te omschrijven is.

Op de flatfile die ingevoerd wordt heb ik enige invloed, dus daar kan nog wat voorbewerking gedaan worden indien nodig.

Een laatste mogelijkheid voor me zou zijn om alsnog verder te gaan met de Java-tool, maar gezien veel uitgebreidere scope van de applicatie t.o.v. de proof-of-concept wordt dat erg omvangrijk en niet erg flexibel. Heeft iemand enig idee hoe ik dit kan doen met XSL, of zijn er wellicht andere mogelijkheden?

Eigenaar/brouwer Milky Road Brewery


Acties:
  • 0 Henk 'm!

Verwijderd

Ik kan je niet helemaal volgen (XSL gebruikt geen platte tekst als input maar XML), en mis context, maar dit helpt je misschien op weg:

XML:
1
2
3
4
5
<xsl:template match="S1P1 | S1P2 | S1P3 | S1P4 | S1P5 | S1P6 | S1P7 | S1P9 | S1P9">
   <text>
     <xsl:value-of select="text()"/>
   </text>
</xsl:template>


Platte tekst naar XML klinkt me echter eerder als een handgeschreven XML Writer oplossing in de oren.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Ram0n
  • Registratie: Maart 2002
  • Laatst online: 03-07 13:05

Ram0n

Bierbrouwende nerd

Topicstarter
Verwijderd schreef op woensdag 26 oktober 2011 @ 17:51:
Ik kan je niet helemaal volgen (XSL gebruikt geen platte tekst als input maar XML), en mis context, maar dit helpt je misschien op weg:

XML:
1
2
3
4
5
<xsl:template match="S1P1 | S1P2 | S1P3 | S1P4 | S1P5 | S1P6 | S1P7 | S1P9 | S1P9">
   <text>
     <xsl:value-of select="text()"/>
   </text>
</xsl:template>


Platte tekst naar XML klinkt me echter eerder als een handgeschreven XML Writer oplossing in de oren.
Oorspronkelijk was het platte tekst, maar ik heb de wijze waarop de output gegenereerd wordt zo gewijzigd dat er xml uitkomt (waarbij alle key-value paren kinderen van de root zijn, het gaat dus slechts 1 niveau diep). Dit om ervoor te zorgen dat ik XML-mappers kan gebruiken om eenvoudig de XSL te laten genereren, maar die lijken dus helaas niet geschikt te zijn voor deze taak.

Het gaat dan toch wat handwerk worden vrees ik, waarbij ik jouw idee zeker kan gebruiken. Dank voor de tip!
Ik twijfelde al, dank voor de verplaatsing.

Eigenaar/brouwer Milky Road Brewery


Acties:
  • 0 Henk 'm!

  • leuk_he
  • Registratie: Augustus 2000
  • Laatst online: 15-07 15:35

leuk_he

1. Controleer de kabel!

Ram0n schreef op donderdag 27 oktober 2011 @ 10:17:
[...]

Het gaat dan toch wat handwerk worden vrees ik, waarbij ik jouw idee zeker kan gebruiken. Dank voor de tip!


[...]

Ik twijfelde al, dank voor de verplaatsing.
XLS kan ook loopen.

http://www.w3schools.com/xsl/xsl_for_each.asp

Als je weet dat de bron een xpath expressie is (mag dus ook data* zijn) dan kom je ook nog eens ergens. Als je een mapper vind die zelf de loops aanmaakt houd ik me aanbevolen.

(ik weet alleen niet zeker of ik je goed snap... )

[ Voor 4% gewijzigd door leuk_he op 27-10-2011 10:25 ]

Need more data. We want your specs. Ik ben ook maar dom. anders: forum, ff reggen, ff topic maken
En als je een oplossing hebt gevonden laat het ook ujb ff in dit topic horen.


Acties:
  • 0 Henk 'm!

  • Ram0n
  • Registratie: Maart 2002
  • Laatst online: 03-07 13:05

Ram0n

Bierbrouwende nerd

Topicstarter
Heel begrijpelijk dat het allemaal wat vaag is, vind het ook lastig om in tekst uit te leggen :) Ik heb de situatie even visueel weergegeven:

Afbeeldingslocatie: http://img256.imageshack.us/img256/1730/xmlt.jpg

Hier zou de oorspronkelijk input als volgt zijn:

XML:
1
2
3
4
5
<S0>Data1</S0>
<S1P1>Data2</S1P1>
<S1P1>Data3</S1P1>
<S1P1>Data4</S1P1>
<S2>Data5</S2>


S0, S1 en S2 in het gewenste schema zijn allemaal repeatable, maar omdat er van S0 en S2 maar één node is in het bronbestand kan je die gewoon mappen zoals in bovenstaand plaatje.

S1P1, S1P2 en S1P3 zouden echter allemaal een node van type S1 moeten worden in de resulterende output, vergelijkbaar met de lijnen die ik fictief heb getekend. Dat lijkt echter niet direct mogelijk met mappers, vandaar mijn vraag of iemand dat wellicht kan bevestigen of toch kan aantonen hoe het wel zo kan.

Indien het niet met een mapper kan zal ik met de hand de transformaties moeten noteren, maar het "probleem" is dat het om honderden van dit soort transformaties gaat en ik wellicht in de toekomst niet degene ben die ze moet uitbreiden. De mogelijkheid om dit op visuele wijze te doen zou enorm schelen in de hoeveelheid werk en de overdracht.

Erg bedankt voor het meedenken in ieder geval :)

[ Voor 4% gewijzigd door Ram0n op 27-10-2011 11:10 ]

Eigenaar/brouwer Milky Road Brewery


Acties:
  • 0 Henk 'm!

  • Ram0n
  • Registratie: Maart 2002
  • Laatst online: 03-07 13:05

Ram0n

Bierbrouwende nerd

Topicstarter
Het lijk er inderdaad op dat ik een visuele oplossing moet laten varen, maar ik heb het zo werkend weten te krijgen:

XML:
1
2
3
4
5
<S1>
  <xsl:for-each select="/*[starts-with(name(.), 'S1P')]">
    <text><xsl:value-of select="."/></text><br/>
  </xsl:for-each>
</S1>


Op deze wijze wordt het ook wat overzichtelijker vanwege de matching van het begin van de string.

Dank voor de hints! Mocht iemand toch nog weten hoe dit eenvoudig te doen is met een visuele mapper houd ik me aanbevolen.

@leuk_he: de mapper in JDeveloper kan wel overweg met de meeste loops, dus het is interessant om daar eens naar te kijken. Het gaat in ieder geval een stuk verder dan de andere tools die ik heb getest. De enige voorwaarde is dat de bron zelf ook één repeatable element is, dan kan je de loop mappen, maar bij mij zijn het er dus meerdere helaas.

Eigenaar/brouwer Milky Road Brewery

Pagina: 1