Jump to content
  • 0

Filemaker xml data manipuleren


walsem

Question

Posted

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!

Recommended Posts

  • 0
Posted

Schaf jezelf een boek over XSLT aan :D ! '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

  • 0
Posted

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?

  • 0
Posted

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

  • 0
Posted

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

  • 0
Posted

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]!

  • 0
Posted

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

  • 0
Posted

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

  • 0
Posted

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.

  • 0
Posted

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 :D

 

- Jeroen

  • 0
Posted

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!

  • 0
Posted

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:

 

 

 

  • 0
Posted

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

  • 0
Posted

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

  • 0
Posted

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.

  • 0
Posted

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! :D

 

- Jeroen

  • 0
Posted

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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...