Jump to content
  • 0

xsl import en xml attributen


Stijn Vanden Eynde

Question

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 to comment

4 answers to this question

Recommended Posts

  • 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 to comment
  • 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 to comment
  • 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 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...