walsem Posted September 12, 2006 Share Posted September 12, 2006 Help!!! Hoe kan ik met een xsl sheet van onderstaande standaard filemaker output naar de daaronder vermelde structuur? Kom er niet uit zelf! Van: <?xml version="1.0" encoding="UTF-8" ?> - 0 - - - - 177475000000003 - Sojasaus - Sojabonen Water - 95,00 5,00 - - 177475000000004 - Sambal - Rode pepers Water - 95,00 5,00 Naar: <?xml version="1.0" ?> - - 177475000000003 Sojasaus - - Sojabonen 95 - Water 5 - 177475000000004 Sambal - - Rode pepers 95 - Water 5 Wie kan mij hiermee helpen. Bij voorbaat dank! Een nieuweling op XML gebied! Quote Link to comment
0 Jeroen Aarts Posted September 13, 2006 Share Posted September 13, 2006 Schaf jezelf een boek over XSLT aan ! 'Beginning XSLT' van Jeni Tennison is een uitstekend standaardwerk. In (erg) grote lijnen doe je het volgende: 1. Verzeker je er eerst van dat je de filemaker namespace in je xslt stylesheet declareert en associeert met een prefix. door bv. xmlns:fm="http://www.filemaker.com/fmpxmlresult" 2. De XSLT stylesheet doorloopt op een hiërarchische manier je brondocument en creëert je doeldocument. Daarom is het uitermate belangrijk om de structuur van bron en doel goed te bestuderen. Creëer template elements (...) voor elk van de brokken uit de FileMaker output: RESULTSET, ROW, COL, DATA. belangrijk is dat je in het match attribuut telkens de prefix van de namespace vermeldt. Voorbeeld: ... 3. Voeg in elk van de templates xslt apply-templates elementen () in, die op een hiërarchish manier je brondocument doorlopen: RESULTSET template -> ROW templates -> ... 4. Binnen elk template element, voeg je de overeenkomende xml tags van het resultaat in: - RESULTSET -> - ROW ->RawMaterial - COL -> RawMaterialId, RawMaterialTradeName, Ingredients Hier zit je met een probleem: de COL elementen uit het brondocument stemmen overeen met verschillende elementen in het doeldocument. Dit kan je oplossen op 3 manieren: a. Je blijft werken op het niveau van het ROW element in het brondocument en je selecteert de COL elementen op basis van positie. Bijvoorbeeld (zie verder). Het probleem van de ingrediënten los je op met een xsl:for-each loop doorheen de DATA elementen van COL[3]. b. Je maaktl 1 COL template en werkt met een parameter die doorgegeven wordt aan deze template, c. Je werkt met zgn. 'moded templates' voor elk van de elementen in het doeldocument een COL template aan te maken in een andere mode. Het werken met variabelen en modes is vrij geavanceerd. Hier meer uitleg over geven zou ons te ver leiden, dus stel ik voor dat je het opzoekt. 5. Met het xsl:value-of element kan je de waarden selecteren die in de DATA elementen zitten in het brondocument. in je COL template selecteer je de tekstwaarde van het DATA element door Bovenstaande is bedoeld als een leidraad om je op weg te zetten. Het is onmogelijk -denk ik- om op een FileMaker forum als dit alle details uiteen te zetten - Jeroen Quote Link to comment
0 walsem Posted September 19, 2006 Author Share Posted September 19, 2006 Hallo Jeroen, alvast bedankt voor je antwoord! Ik ben verder aan het stoeien gegaan en mis alleen de data voor de verschillende portalen. De stylesheet ziet er nu als volgt uit: De output is nu als volgt: <?xml version='1.0' encoding='UTF-8' ?> 0 177475000000003 0001 Sojasaus Sojasaus 1774750000 DJ n n n RN n n DJ 12-9-2006 j Het vreemde is nu dat hij wel ziet dat er meerdere ingredienten zijn, maar hij geeft de data niet weer. Wat doe ik fout? Quote Link to comment
0 Jeroen Aarts Posted September 19, 2006 Share Posted September 19, 2006 Blij te zien dat je goed op weg bent geraakt. Volgende opmerkingen: 1. In je voorbeeld loop je niet over de DATA elementen binnen COL[25], maar loop je verder over de COL elementen. De waarden uit de portal zitten nu juist verpakt in verschillende DATA elementen in een zelfde COL element 2. Bij het toepassen van for-each verschuift de context naar de geselecteerde node in het brondocument. Dit is in het eerste element van het 25ste COL element (als je '*' gebruikt selecteert de XSLT processor gelijk welk child element) Wat je in feite moet doen is iets als Op deze manier loop je over alle DATA elementen van het 25ste COL element. - Jeroen Quote Link to comment
0 walsem Posted September 19, 2006 Author Share Posted September 19, 2006 bedankt voor de snelle reactie! Ik ga meteen aan het werk! Gr. Dirk-Jan Quote Link to comment
0 Jeroen Aarts Posted September 19, 2006 Share Posted September 19, 2006 Sorry, code moet zijn: - Jeroen Quote Link to comment
0 walsem Posted September 19, 2006 Author Share Posted September 19, 2006 Ik kwam er al niet uit! Maar dit werkt helemaal perfect! Ik heb nu alleen nog het probleem dat ik het gegenereerde xml document wel met Stylus Studio 2006 kan lezen maar niet in Explorer openen, terwijl dat met de door Filemaker direct gegenereerde xml output wel gaat. Wat is er fout in de header van m'n stylesheet? Gr. Dirk-Jan Quote Link to comment
0 walsem Posted September 19, 2006 Author Share Posted September 19, 2006 Nog niet helemaal! Ik krijg netjes alle Id's, maar hoe krijg ik de waarden van de overige velden daaronder? zie stukje stylesheet: Hoe geef ik aan wat de waarde bij IngredientDescription moet zijn? De waardes bevinden zich in COL [26]! Quote Link to comment
0 Jeroen Aarts Posted September 19, 2006 Share Posted September 19, 2006 Het probleem is dat er in een xml document maar in document element kan zijn. Dit is het hoofdelement. In jou output staat er een text node voor, nl. "0". Dit is opgelost door regel 3 te veranderen in Hierbij doorloopt de XSLT processor mooi in lijn je brondocument van root naar document element tot RESULTSET element. Doordat je geen root match had (match="/"), werd de built-in template opgeroepen die 0 teruggaf - Jeroen Quote Link to comment
0 walsem Posted September 19, 2006 Author Share Posted September 19, 2006 Ik blijf die 0 houden in m'n output! Quote Link to comment
0 Jeroen Aarts Posted September 19, 2006 Share Posted September 19, 2006 Yep, indien je in je FileMaker xml meerdere portal columns hebt, dan wordt het ingewikkelder. Je moet nu met axes werken. Je hebt iets nodig als: , , Deze code gaat voor elke DATA element binnen het 25ste COL element, het (in positie) overeenkomende DATA element van het eerstvolgende COL element weergeven. - Jeroen Quote Link to comment
0 walsem Posted September 19, 2006 Author Share Posted September 19, 2006 Klinkt heel logisch, maar het werkt niet, hij doet helemaal niets! By the way: Alvast hardstikke bedankt voor je moeite, ik geloof dat we er wel uit gaan komen. Quote Link to comment
0 walsem Posted September 19, 2006 Author Share Posted September 19, 2006 Correctie: ik heb "fmp:" toegevoegd en het werkt! Bedankt! Quote Link to comment
0 Jeroen Aarts Posted September 19, 2006 Share Posted September 19, 2006 Ja, ik had zelf een simpel voorbeeld uitgewerkt zonder de fmp namespace, vandaar. Om de 0 weg te krijgen, kunnen we toch best een match="/" (root) template maken, en dan de rest van de stylesheet uitwerken. Ik vermoed dat de default filemaker namespace in het brondocument er voor iets tussenzit. Volgende XML ProductNaam1 ProductNaam2 ProductNaam3 Hoeveelheid1 Hoeveelheid2 Hoeveelheid3 werkt alvast perfect met volgende XSLT stylesheet <?xml version="1.0"?> Voila, uiteindelijk toch een uitgebreid voorbeeld - Jeroen Quote Link to comment
0 walsem Posted September 19, 2006 Author Share Posted September 19, 2006 Kijk dat ziet er keurig uit! Ik heb alleen nu het probleem dat ik wel het eerste element bij: krijg, maar de waardes uit de volgende records niet! Quote Link to comment
0 Jeroen Aarts Posted September 19, 2006 Share Posted September 19, 2006 Oeps, even over het hoofd gezien. Snel opgelost met gebruik van de position() functie en een variabele. Stylesheet wordt dan: <?xml version="1.0"?> - Jeroen Quote Link to comment
0 walsem Posted September 19, 2006 Author Share Posted September 19, 2006 Helemaal Top! Werkt perfect en het document is nu ook weer in Explorer te zien! Mijn dank is heeeeeeeeeeeeeeeeeeel erg groot! Gr. Dirk-Jan Quote Link to comment
0 Jeroen Aarts Posted September 19, 2006 Share Posted September 19, 2006 Mijn dank is heeeeeeeeeeeeeeeeeeel erg groot! Een dosis XSLT houdt je mentaal fit - graag gedaan Jeroen Quote Link to comment
0 walsem Posted September 20, 2006 Author Share Posted September 20, 2006 hallo Jeroen, Op het eerste niveau van mijn ingredienten gaat het goed, alleen mijn allergenen en subingredienten worden niet weergegeven op deze manier. Wat doe ik fout (afsluitende tags zijn er wel maar heb ik hier niet meegekopieerd!) Stylesheet ziet er als volgt uit: Quote Link to comment
0 Jeroen Aarts Posted September 20, 2006 Share Posted September 20, 2006 Het probleem is -vermoed ik - de scope van de variabele i. XSLT variabelen zijn geldig in de gehele context van de parent node. In jouw geval het element select>. Het probleem is dat we dezelfde variabele opnieuw gebruiken in de geneste for-each elementen. De oplossing is simpel: gebruik voor elke for-each lus een andere variabele: i, j, k bijvoorbeeld. - Jeroen Quote Link to comment
0 walsem Posted September 20, 2006 Author Share Posted September 20, 2006 Ik heb de variabelen aangepast, i,j,k,l,m,n,o,p,r maar er is geen verschil! Ligt dat soms aan: moet hier nu ook een variable bij? Quote Link to comment
0 walsem Posted September 20, 2006 Author Share Posted September 20, 2006 Hierbij even de gehele stylesheet, is misschien iets duidelijker! <?xml version="1.0"?> Quote Link to comment
0 Jeroen Aarts Posted September 20, 2006 Share Posted September 20, 2006 Hee, ik heb het gevonden! Het heeft toch met context te maken. Het probleem is het volgende: - in de hoofdlus match je alle DATA elementen van het 54ste COL element - in de geneste lussen wil je DATA elementen selecteren uit volgende COL elementen (147ste, 86ste) - aangezien je context zich in je hoofdlus op het niveau van het DATA element bevindt, zal de XSLT processor binnen deze context uiteraard geen COL elementen meer vinden Oplossing: - Verlaat binnen de geneste lus de DATA context door eerst terug naar de parent van de parent te gaan (via COL terug naar ROW element!) wordt dan - Jeroen Quote Link to comment
0 walsem Posted September 20, 2006 Author Share Posted September 20, 2006 Heel gedoe zo'n stylesheet! Het werkt nog niet, ik krijg nu bij alle bovenliggende records alle onderliggende data te zien en niet alleen die van dat specifieke record! Ik hoop dat ik duidelijke ben. Quote Link to comment
0 Jeroen Aarts Posted September 20, 2006 Share Posted September 20, 2006 Ja, dat zag ik al. Door for-each lussen op COL niveau te nesten, krijg je uiteraard alle combinaties de subniveaus (ingredienten, allergenen (?), ...) Ik denk dat je ondertussen alle gereedschap in handen hebt om de stylesheet te vervolledigen. Nu moet je alleen moet je goed nadenken over welke output elementen je waar in je stylesheet zet. Het komt mij bv. voor dat je enclosing elementen uit de output (bv. ) in je for-each lussen zet i.p.v. erbuiten. Ik weet dat dat ook zeer complex kan zijn, maar het overstijgt wel de scope van dit forum. Ik stel dan ook voor dat we deze draad hierbij afsluiten. Het lukt je wel! - Jeroen Quote Link to comment
0 walsem Posted September 20, 2006 Author Share Posted September 20, 2006 hallo Jeroen, Ik weet dat ik lastig ben, maar ik kom er niet uit! Logischerwijs zou ik zeggen dat ik een niveau te hoog zit nu, met: Maar: werkt niet! Heb je heel misschien nog de laatste tip? Gr. Dirk-Jan Quote Link to comment
Question
walsem
Help!!!
Hoe kan ik met een xsl sheet van onderstaande standaard filemaker output naar de daaronder vermelde structuur? Kom er niet uit zelf!
Van:
<?xml version="1.0" encoding="UTF-8" ?>
-
0
-
-
-
-
177475000000003
-
Sojasaus
-
Sojabonen
Water
-
95,00
5,00
-
-
177475000000004
-
Sambal
-
Rode pepers
Water
-
95,00
5,00
Naar:
<?xml version="1.0" ?>
-
-
177475000000003
Sojasaus
-
-
Sojabonen
95
-
Water
5
-
177475000000004
Sambal
-
-
Rode pepers
95
-
Water
5
Wie kan mij hiermee helpen. Bij voorbaat dank!
Een nieuweling op XML gebied!
Link to comment
27 answers to this question
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.