Ga naar inhoud
  • 0

xsl import en xml attributen


Stijn Vanden Eynde

Vraag

Hallo allemaal,

Ik zou volgende xml willen importeren

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Products>
    <Product id="3001" name="product1" />
    <Product id="3002" name="product2" />
</Products>

met behulp van deze xsl

<?xml version='1.0' encoding='UTF-8'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult">
            <METADATA>
                <FIELD NAME="product_id" TYPE="NUMBER"/>
                <FIELD NAME="product_name" TYPE="TEXT"/>
            </METADATA>
            <RESULTSET>
                <xsl:for-each select="Product">
                    <ROW>
                        <COL><DATA><xsl:value-of select="@id"/></DATA></COL>
                        <COL><DATA><xsl:value-of select="@name"/></DATA></COL>
                    </ROW>
                </xsl:for-each>
            </RESULTSET>
        </FMPXMLRESULT>
    </xsl:template>
</xsl:stylesheet>

Helaas worden er geen records geïmporteerd. Er staat ook geen data in het gegenereerde fmpxmlresult.

Als de gegevens tussen xml-tags staan is er geen probleem. De xml van een extern programma, dus het formaat kan ik niet wijzigen.

Kan dit opgelost worden ?

Link naar reactie

4 antwoorden op deze vraag

Aanbevolen berichten

  • 0

@Menno bedankt voor je antwoord. Je suggestie werkte voor een zelfgeschreven xml, helaas niet voor de xml die uit het ander programma komt.

Dit is een summier voorbeeld van hoe de xml van het ander programma er uit ziet:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Container xmlns="http://url.to.vendor.com">
    <Products>
        <Product name="product-naam"/>
    </Products>
</Container>

Het probleem zit in het feit dat er een xmlns attribuut is gedefinieerd in Container.
Als ik die definitie verwijder, werkt de xsl omzetting zoals verwacht.

Voorlopig probeer ik het op te lossen door de xml eerst met behulp van php om te zetten naar json.
Ter referentie, de php om xml om te zetten naar json:

<?php
$xml = simplexml_load_string($_POST['xml_content']);
$json = json_encode($xml);
header('Content-Type: application/json');
echo $json;

Hierdoor kan ik dan de volgende code schrijven:

Insert from URL [ Select ; With dialog: Off ; $json ; $url_to_php ; cURL options: $post_opts ]
Set Variable [ $product_name ; JSONGetElement( $json ; "Container.Products.Product[0].@attributes.name" ) ]

Deze manier werkt ook goed, maar ik verkies toch liever een xsl methode.
Alle hulp of feedback is altijd welkom.

 

Link naar reactie
  • 0

Als een xml een namespace heeft, dan hoef je alleen maar de namespace in je xsl op te nemen:

<?xml version='1.0' encoding='UTF-8'?>
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:vdr="http://url.to.vendor.com">
    <xsl:template match="*">
        <FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult">
            <METADATA>
                <FIELD NAME="product_name" TYPE="TEXT"/>
            </METADATA>
            <RESULTSET>
                <xsl:for-each select="vdr:Products/vdr:Product">
                    <ROW>
                        <COL>
                            <DATA>
                                <xsl:value-of select="@name"/>
                            </DATA>
                        </COL>
                    </ROW>
                </xsl:for-each>
            </RESULTSET>
        </FMPXMLRESULT>
    </xsl:template>
</xsl:stylesheet>

Het gaat daarbij om de toevoeging: xmlns:vdr="http://url.to.vendor.com" én om de toevoeging vdr: in select="vdr:Products/vdr:Product" de toevoeging vdr is geheel arbitrair, daar had net zo goed mijnverzonnennamespace oid kunnen staan. In het x-path had dan dié namespace moeten worden gebruikt, nu is dat vdr.

Je basisdocument heeft een namespace en die moet je dan ook gebruiken in de xsl. Je ziet soms ook dat een deel van een document een namespace heeft en een deel niet. Om iets te kunnen selecteren in het deel zonder namespace, moet je er zelf eentje toevoegen .... dit is een puntje dat xml/xsl voor veel mensen lastig maakt om te doorgronden. Weet je dit niet, dan kan je erg lang zoeken naar de oplossing.

Het is in elk geval niet nodig om via php wat om te vormen

Link naar reactie
  • 0

Ik had iets langer moeten zoeken alvorens hier te posten... want 5 minuten na mijn post vond ik op een engels forum hetzelfde antwoord als het jouwe. 

Bij het importeren van een xml van een ander programma had ik geen problemen, maar die had dan ook geen namespace gedefinieerd.
Deze dus wel, en achteraf gezien is het ook logisch dat het omwille van namespaces niet werkt.

Toch bedankt voor de hulp !

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