Ga naar inhoud
  • 0

Filemaker importeert XML met slechts één record, met alle data in één veld


Vitruvius

Vraag

Ik heb een XML met data waarbij ik de standaards XSLT van filemaker al heb aangepast dat die één niveau inspringt.

Het probleem is echter dat de filemaker slechts één record importeert met de juiste veldnamen, maar in elk veld komt dan alle data die normaal gezien over de verschillende velden in een record komt.

Er staat in de XML meer data dan ik nodig heb. Ik heb enkel nodig wat in het eerste niveau onder "zaak" staat. Van het eerste "record" in de XML heb ik dus alles nodig, van de tweede heb ik niets meer nodig vanaf (en inclusief) "zaakdocumenten" want dat is een niveau lager

rce-gemeente-Vaals.xml msdso_elem kopie.xslt

Link naar reactie

10 antwoorden op deze vraag

Aanbevolen berichten

  • 0

Probeer het eens met deze:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<xsl:output method="XML" version="1.0" encoding="UTF-8" indent="yes" />
	<xsl:strip-space elements="*"/>
	<xsl:template match="*">
		<FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult">
			<ERRORCODE>0</ERRORCODE>
			<PRODUCT BUILD="" NAME="" VERSION=""/>
			<DATABASE DATEFORMAT="M/d/yyyy" LAYOUT="" NAME="" RECORDS="{count(/archis3/zaken/*)}" TIMEFORMAT="h:mm:ss a"/>
			<METADATA>
				<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="zaak_id" TYPE="number" />
				<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="zaaktype_id" TYPE="number" />
				<FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="cho_id_onderzoeksgebied" TYPE="number" />
			</METADATA>
			<RESULTSET>
				<xsl:attribute name="FOUND"><xsl:value-of select="count(/archis3/zaken/zaak)"/></xsl:attribute>
				<xsl:for-each select="/archis3/zaken/zaak">
					<ROW>
						<xsl:attribute name="MODID">0</xsl:attribute>
						<xsl:attribute name="RECORDID"><xsl:value-of select="position()"/></xsl:attribute>
						<!-- data -->
						<COL><DATA><xsl:value-of select="zaak_id"/></DATA></COL>
						<COL><DATA><xsl:value-of select="zaaktype_id"/></DATA></COL>
						<COL><DATA><xsl:value-of select="cho_id_onderzoeksgebied"/></DATA></COL>
					</ROW>
				</xsl:for-each>
			</RESULTSET>
		</FMPXMLRESULT>
	</xsl:template>
</xsl:stylesheet>

De metadata hoef je niet perse aan te vullen, dat is alleen handig bij het toewijzen van de velden in de import. De <COL><DATA>... kan je aanvullen met alle velden die je nodig hebt. Kijk verder even op https://www.w3schools.com/xml/default.asp en https://www.w3schools.com/xml/xpath_intro.asp en https://www.w3schools.com/xml/xsl_intro.asp voor meer info

Link naar reactie
  • 0

Vitruvius en/of Menno,

Uitgaande van dit XML bestand en de XLST van Menno, hoe krijg ik <zaakdocumenten>..</zaakdocumenten> in een gerelateerde table?
Voor over ik kan zien hebben de <zaakdocumenten> geen KEY samen.
Kan dit in één import en XLST? En hoe pak ik dit aan?
En hoe maak ik een KEY waarde aan voor de relatie , in het voorbeeld van Vitruvius, <zaak> <-> <zaakdocument>?

Ik puzzel nu aan een eigen, vergelijkbare import.
- platte gegevens per record
<items>
        <item>..<item>
        <item>..<item>
</items>

-> die is gelukt

- maar per <item> heb ik een aantal
<items>
        <item>
        ....
        <docs>
        <doc>A.pdf</doc>
        <doc>B.pdf</doc>
        </docs>
        </item>
<items>

 

Link naar reactie
  • 0
55 minutes ago, Banach said:

Simpelweg een tweede import in de gerelateerde tabel doen met een key die het gerelateerde record aan het hoofdrecord linkt.

dat is een manier, al had gehoopt dat het in een keer zou kunnen, want dan lijkt me ze dezelfde key geven te doen
met een separate import zie ik dat nog niet, maar ik zal  iets over het hoofd zien
(in de xml is geen key)

Link naar reactie
  • 0

Bij je eerste import genereer je zelf een key welke je opslaat in je tabel. Een UUID, volgnummer, whatever. Die key sla je op in een al dan niet globale variabele en dan doe je de tweede import en voeg je de key uit de variabele in. Dat kan b.v. met een autoenter calculation tijdens de import. Ook kun je direct na de import de key invullen met een replace contents. Let dan op dat er wel iets te importeren moet zijn geweest! Doe hier dus wat aan foutafhandeling voor wanneer de import niet goed is gegaan.

Zelf een key genereren is trouwens de best practice, of eigenlijk verplicht. Je kunt immers niet 100% vertrouwen op de juistheid van een extern aangeleverd gegeven. Wanneer daar een fout in zit moet dat bij jou geen probleem opleveren. Hou zelf de controle over de keys.

aangepast door Banach
Link naar reactie
  • 0

@Marsau: als je e e a te binnen schiet... want ik ben er nog niet 100% uit.

@Banach: ik volg je uitleg geloof ik. Kort in mijn woorden:

- 1ste import is van de <items> in de items tabel
elk record krijgt een auto-enter serial (wat de key van het record wordt)

de serial/key van het eerste record gaat in een $variable

- 2e import is van de <items>..<docs> in de docs tabel

elk record krijgt een serial ($variable+1, $variable+2,  $variable+3, etc)
 

dit gaat fout bij <items> zonder <docs>

ik denk hierom dat je het zo niet bedoelt..

Link naar reactie
  • 0

Het is niet mogelijk om records én gerelateerde in één gang te importeren

De xslt voor de header records kan er volgt uitzien:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <xsl:output method="XML" version="1.0" encoding="UTF-8" indent="yes" />
    <xsl:strip-space elements="*"/>
    <xsl:template match="*">
        <FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult">
            <METADATA>
                <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="item_id" TYPE="text" />
            </METADATA>
            <RESULTSET>
                <xsl:for-each select="/items/item">
                    <xsl:variable name="item_id" select="position()"/>
                    
                    <ROW>
                        <!-- data -->
                        <COL><DATA><xsl:value-of select="$item_id"/></DATA></COL>
                    </ROW>
                    
                </xsl:for-each>
            </RESULTSET>
        </FMPXMLRESULT>
    </xsl:template>
</xsl:stylesheet>

De xslt voor de related records kan er dan als volgt uitzien:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <xsl:output method="XML" version="1.0" encoding="UTF-8" indent="yes" />
    <xsl:strip-space elements="*"/>
    <xsl:template match="*">
        <FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult">
            <METADATA>
                <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="item_id" TYPE="text" />
                <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="docname" TYPE="text" />
            </METADATA>
            <RESULTSET>
                <xsl:for-each select="/items/item">
                    <xsl:variable name="item_id" select="position()"/>
                    
                    <xsl:for-each select="doc">
                         <ROW>
                             <!-- data -->
                             <COL><DATA><xsl:value-of select="$item_id"/></DATA></COL>
                             <COL><DATA><xsl:value-of select="."/></DATA></COL>
                        </ROW>
                    </xsl:for-each>
                    
                </xsl:for-each>
            </RESULTSET>
        </FMPXMLRESULT>
    </xsl:template>
</xsl:stylesheet>

Met deze xml:

<?xml version="1.0" encoding="UTF-8"?>
<items>
    <item>
        <doc>a.pdf</doc>
        <doc>b.pdf</doc>
        <doc>c.pdf</doc>
    </item>
    <item>
        <doc>d.pdf</doc>
        <doc>e.pdf</doc>
    </item>
    <item></item>
    <item>
        <doc>f.pdf</doc>
    </item>
    <item>
        <doc>g.pdf</doc>
        <doc>h.pdf</doc>
        <doc>i.pdf</doc>
        <doc>j.pdf</doc>
        <doc>k.pdf</doc>
    </item>
</items>

Als je dan 2 imports doet van dezelfde xml, dan zijn er tijdelijke FK's geïmporteerd, die liggen tussen 1 en het aantal items. Die moet je nog wel even vervangen met unieke ID's van je headers. Zie de bijlage

 

McG_test.zip

Link naar reactie

Doe mee aan dit gesprek

Je kunt dit nu plaatsen en later registreren. Indien je reeds een account hebt, log dan nu in om het bericht te plaatsen met je account.

Gast
Beantwoord deze vraag...

×   Geplakt als verrijkte tekst.   Plak in plaats daarvan als platte tekst

  Er zijn maximaal 75 emoji toegestaan.

×   Je link werd automatisch ingevoegd.   Tonen als normale link

×   Je vorige inhoud werd hersteld.   Leeg de tekstverwerker

×   Je kunt afbeeldingen niet direct plakken. Upload of voeg afbeeldingen vanaf een URL in

×
×
  • Nieuwe aanmaken...