Jump to content
  • 0

aanpassen XLS stylesheet


Rony Rabijns

Question

Posted

Ik loop al een paar dagen tegen een probleem aan dat ik maar niet opgelost krijg.

Misschien kan één van jullie het licht laten schijnen ? :-)

 

Probleem :

Alle klanten die orders hebben worden geëxporteerd met de daarbij horende orderlijnen.

Ik exporteer vanuit FMP naar XML via een stylesheet.

 

In de output zie ik netjes alle orders van de klanten gegroepeerd zitten.

Waar ik niet in slaag is om de orderlijnen per order te groeperen.

 

In bijlage de XLS stylesheet "crowndesk-fout.xsl” die de data formatteert.

De XML "crowndesk-fout.xml" is de output van mijn stylesheet.

ps : Ik heb bij wijze van demo slechts 1 klant geëxporteerd, in werkelijkheid gaat het over 100-den klanten in 1 XML.

 

Wat ik eigenlijk wil is "crowndesk-correct.xml".

 

"crowndesk-velden" is een screenshot van de velden die gebruikt worden in FMP.

 

Kan iemand me helpen met de opbouw van de stylesheet ?

Alvast bedankt om me iets te laten weten.

crowndesk.zip

3 answers to this question

Recommended Posts

  • 0
Posted

Ik ga er gemakshalve vanuit dat de portaal-records met de artikelen die je exporteert alle velden data bevatten ( test of er meer dan 1 portaal-record is) en heb jouw xsl zodoende iets uitgebreid. Denk dat je zo verder kan:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Sectie waarin de een namespace wordt gedeclareerd, om verwarring voor de parser te voorkomen (letterlijk). 
De namespace wordt daarna door "exclude-result-prefixes" uit het eind-resultaat weggefilterd -->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fmp="http://www.filemaker.com/fmpxmlresult" version="1.0" exclude-result-prefixes="fmp">
	
	<!-- Het type eindresultaat (in dit geval XML) wordt hier bepaald, net als de encoding, m.a.w. de kopregel "<?xml etc...."
	met "indent" wordt de parser verteld dat de ¶ naar het eindresultaat gaan -->
	<xsl:output method="XML" version="1.0" encoding="UTF-8" indent="yes" />
	
	<xsl:strip-space elements="*"/>
	
	<!-- Dit element is een verplichte en moet altijd aan het begin staan van de transformatie -->
	<xsl:template match="fmp:FMPXMLRESULT">
		
		<!-- Hier start de "root" van het nieuwe document -->
		<crowndesk>
		
			<xsl:for-each select="fmp:RESULTSET/fmp:ROW[generate-id() = generate-id(key('rows', fmp:COL[1]/fmp:DATA)[1])]">
				<!-- Voor elke ROW van de RESULSET wordt het volgende geschreven: -->
				<klant>
					
					<id><xsl:value-of select="fmp:COL[1]/fmp:DATA"/></id>
					
					<orders>
						
						<xsl:for-each select="key('rows', fmp:COL[1]/fmp:DATA)">
							
							<order_nummer><xsl:value-of select="fmp:COL[11]/fmp:DATA"/></order_nummer>
							<order_referentie><xsl:value-of select="fmp:COL[12]/fmp:DATA"/></order_referentie>
							
							<xsl:if test="fmp:COL[18]/fmp:DATA[2]=''">
								<!-- Er is maar één artikel op de order, dus wordt er geen element 'orderlijnen' gemaakt -->
								<order_artikel><xsl:value-of select="fmp:COL[16]/fmp:DATA"/></order_artikel>
								<order_aantal_besteld><xsl:value-of select="fmp:COL[17]/fmp:DATA"/></order_aantal_besteld>
							</xsl:if>
							
							<xsl:if test="fmp:COL[18]/fmp:DATA[2]!=''">
								<!-- Er meerdere artikelen op de order, dus wordt er een element 'orderlijnen' gemaakt -->
								<orderlijnen>
									<!-- In de FMPXMLRESULT worden portaalrecords weergegeven als 
									<COL>
										<DATA/>
										<DATA/>
									</COL> 
									Dmv door het aantal achtereenvolgende "DATA" elementen te lussen kunnen portaalrecords worden opgebouwd. Weer voor de leesbaarheid is het handig om de opbouw van een
									portaalrecord in template te doen. de functie "position()" geeft hier de iteratie mee met de aanroep, zodat de template, de juiste 'occurrence' van DATA-element oppikt. -->
									<xsl:for-each select="fmp:COL[17]/fmp:DATA">
										<xsl:call-template name="portaalrecords"><xsl:with-param name="portaalrijnr" select="position()"/></xsl:call-template>
									</xsl:for-each>
								</orderlijnen>
								
							</xsl:if>
							
						</xsl:for-each>
						
					</orders>
					
				</klant>
				<!-- de variabelen bestaan vanaf hier niet meer -->
			</xsl:for-each>
		</crowndesk>
		
	</xsl:template>
	
	<!-- De portaalrecords worden hier uitgelezen en gebruikt om de orderregels op te bouwen -->
	<xsl:template name="portaalrecords">
		<xsl:param name="portaalrijnr"/>
		<orderlijn>
			
			<!-- Hier wordt de inhoud van "orderregel" gevuld -->
			<order_artikel><xsl:value-of select="../../fmp:COL[16]/fmp:DATA[$portaalrijnr]"/></order_artikel>
			<order_aantal_besteld><xsl:value-of select="../../fmp:COL[17]/fmp:DATA[$portaalrijnr]"/></order_aantal_besteld>
			
		</orderlijn>
		
	</xsl:template>
</xsl:stylesheet>
 
  • 0
Posted

Dag Menno,

 

Bedankt voor het meedenken.

Als ik je XSL bekijk, denk ik dat je vertrekt van een verkeerd gegeven : ik exporteer vanuit een "platte" tabel. Dus er zijn geen gerelateerde records. Ieder record is een orderlijn met ordernummer, artikel, aantal. Indien een order origineel meerdere lijnen had, zijn dat nu meerdere records geworden.

Maar in de output wil inderdaad de orderlijnen (opnieuw) groeperen onder één order.

 

Rony

  • 0
Posted

zonder het fmpxmlresult is het gokken wat het uitgangspunt is en aangezien een header-regel structuur het meest gebruikt is heb ik het zo opgelost.

 

Verder kan ik me eigenlijk niet voorstellen dat je dat niet beschikbaar hebt, dus áls je orders en regel hebt hebt, dan kan je gewoon orders met regels exporteren en werkt het stylesheet gewoon :D

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