Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[XSL] Meerdere XSL files aanroepen vanuit één centrale XSL

Pagina: 1
Acties:

  • timothee
  • Registratie: Oktober 2000
  • Laatst online: 26-11 21:09
Hallo,

Ik zit met een vraagstukje waar ik niet uit kom en hoop dat iemand hier mij in de goede richting kan duwen. Ik heb in het boek XSLT 2.0 van Michael Kay gezocht en op internet, maar mogelijk zoek ik niet op de juiste termen want ik vind geen oplossing.

De situatie is als volgt:

Ik heb één map met XML bestanden. De XML bestanden zijn onder te verdelen in 11 soorten XML bestanden, ze staan echter allemaal in één en dezelfde bronmap.
De XML bestanden zijn heel plat qua structuur, maar bevatten wel allemaal andere elementnamen.

De structuur ziet er globaal als volgt uit:

<document>
<element1 />
<element2 />
<element3 />
<element4 />
enz.
</document>


De namen van de elementen verschillen dus per soort XML bestand.
Ik heb nu voor elk van de 11 type XML bestanden een apart XSL bestand gemaakt waarmee ze kunnen worden vertaald.

De structuur van het doel XML bestand is dusdanig anders, dat ik meteen vanaf de root moet gaan vertalen.

Mogelijk dat de 11 XSL bestanden zijn samen te voegen tot 1 bestand, maar dat wil ik uit beheer oogpunt liever niet...ik hou het liever simpel.

Nu zit ik toch met een probleem: <element1 /> heeft altijd een waarde op basis waarvan ik kan bepalen om welk type XML bestand het in dat specifieke geval gaat én welke XSL file gebruikt zou moeten worden om te vertalen.

Nu vraag ik mij af: hoe kan ik een "overkoepelend" XSL bestand maken die de juiste "sub-XSL" aanspreekt op basis van de waarde van <element1 />.

Ik roep nu nl. via een VBscript de Saxon XML parser aan. Daarbij geef ik aan wat de input en output map is en welke XSL gebruikt moet worden. Zoals gezegd bevat de input map meerdere soorten XML bestanden. Ik wil Saxon verwijzen naar de "overkoepelende" XSL file...

Heeft iemand enig idee hoe ik dit kan aanpakken?


P.S.
<xsl:import> en <xsl:include> zijn geen opties omdat ik niet delen van de XSL in een module wil opslaan, maar een compleet aparte XSL wil aanspreken op basis van een waarde van een element in het bron XML bestand.

[ Voor 5% gewijzigd door timothee op 19-12-2007 16:26 ]


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 18:39

Dido

heforshe

Je kunt 1 XSL opgeven aan SAXON, en je wilt daar geen include in gebruiken... dus je wilt niet dat ene bestand aangeven, maar een andere, en je wete niet van tevoren welke. Dat gaat dus niet werken, ben ik bang.

Ik begrijp je probleem met een conditionele include niet zo goed, hoor. Je zit met een klein beetje overhead (heb je sowieso met een "centraal" xsl-bestand) maar al de rest hou je toch lekker in je losse bestanden?

Wat betekent mijn avatar?


  • timothee
  • Registratie: Oktober 2000
  • Laatst online: 26-11 21:09
Ik lees net het volgende in het XSLT 2.0 boek van Michael Kay:

"People sometimes ask how to include other stylesheets conditionally at runtime, based on conditions found in the source document. The answer is simple: you can't."

Dit is inderdaad precies wat ik wil: op basis van een waarde in het bron XML bestand bepalen wat er moet gebeuren.

Ik ben er nog niet uit welke alternatieven er zijn.
Zo'n conditionele include lijkt me een goede oplossing, maar ik weet nog niet hoe ik dat in dit geval moet toepassen. Het output XML bestand ziet er totaal anders uit, vandaar dat ik het in de separate XSL bestanden lekker simpel heb gehouden: start/match vanaf de root en bouw in de XSL gewoon het output XML bestand op. Op de plekken waar waarden moeten staan, verwijs ik naar de bron XML.

Met zo'n include constructie heb ik in elk geval een beginpunt nodig en dat kan m.i. niet de root zijn.

Heeft iemand van jullie ooit een soortgelijk probleem gehad? Dat je meerdere soorten XML bestanden wilt vertalen met 1 XSL file?

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

Volgens mij kan je gewoon een root template maken die kijkt naar de waarde in je element1 en dan met een mode attribuut dispatcht naar een andere rootmatchende template (die je via include in een andere XSL-sheet zou kunnen hebben).

Rustacean


  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

Manuzhai schreef op donderdag 20 december 2007 @ 09:33:
Volgens mij kan je gewoon een root template maken die kijkt naar de waarde in je element1 en dan met een mode attribuut dispatcht naar een andere rootmatchende template (die je via include in een andere XSL-sheet zou kunnen hebben).
Dat lijkt mij ook de enige manier ja.. Een hoop <xsl:choose>'s etc, maar dat werkt wel. Vergeet ook niet dat XSLT 2.0 nog niet mainstream is!

Sundown Circus