Jump to content
  • 0

Filemaker xml data manipuleren


walsem

Question

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

Recommended Posts

  • 0

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

Link to comment
  • 0

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?

Link to comment
  • 0

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

Link to comment
  • 0

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

Link to comment
  • 0

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

Link to comment
  • 0

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

Link to comment
  • 0

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:

 

 

 

Link to comment
  • 0

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

Link to comment
  • 0

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

Link to comment
  • 0

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

Link to comment

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...