Toon posts:

[XSL] dynamisch Namespace declareren

Pagina: 1
Acties:

Verwijderd

Topicstarter
Als invoer heb ik steeds verschillende xml bestanden.
Deze zijn qua structuur het zelfde maar de namespaces verschillen,
hieruit blijkt de versie van het bestand.
Twee voorbeelden:
XML:
1
2
3
4
<LALA xmlns:ns2="http://test/v_0_2">
    <ns2:ACTIONCODE>actie code 2</ns2:ACTIONCODE>
    <ns2:testmij>test voor 2</ns2:testmij>
</LALA>

XML:
1
2
3
4
<LALA xmlns:ns1="http://test/v_0_1">
    <ns1:ACTIONCODE>actie code </ns1:ACTIONCODE>
    <ns1:testmij>test voor 1</ns1:testmij>
</LALA>


Om deze xml bestanden om te zetten 'switch' ik op de namespace in mijn xsl bestand.
So far so good. Omdat de structuur het zelfde is van de xml's zou ik
een deel van mijn xsl code willen hergebruiken.
Om dit te doen heb ik een 'common' template gemaakt dat voor beide
xml bestanden van toepassing is. Ik zou alleen graag in dit template de namespace
declaratie van de bron dynamisch doen.
(de xsl code maakt het een stuk duidelijker hoop ik).
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:fn="http://www.w3.org/2005/02/xpath-functions"
>
    <!-- actioncode is always set-->
    <xsl:variable name="source_namespace" select="namespace-uri(//*[local-name()='ACTIONCODE'])"/>
    <!-- test which template is used in this message -->
    <xsl:template match="/">
        <wrapper>   
            <namespace-detected>
                <xsl:value-of select="$source_namespace"/>
            </namespace-detected>
            <!-- switch here -->
            <xsl:choose>
                <xsl:when test="$source_namespace='http://test/v_0_1'">
                    <xsl:call-template name="test"/>
                </xsl:when>
                <xsl:when test="$source_namespace='http://test/v_0_2'">
                    <xsl:call-template name="test2"/>
                </xsl:when>
                <!-- possible errors-->
                <!-- niet relevant voor nu
                <xsl:when test="$source_namespace=''">
                    <xsl:call-template name="NO_NAMESPACE"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:call-template name="UNKNOWN_NAMESPACE"/>
                </xsl:otherwise>
                -->
            </xsl:choose>
        </wrapper>
    </xsl:template>

    <xsl:template name="test">
        <test>
            <xsl:call-template name="common"/>
        </test>
    </xsl:template>

    <xsl:template name="test2">
        <test2>         
            <xsl:call-template name="common"/>
        </test2>
    </xsl:template>

    <!-- werkt wel, maar voor maar een xml bestand type
    <xsl:template name="common" xmlns:source="http://test/v_0_1">
    -->
    <!-- werkt niet -->
    <xsl:template name="common" xmlns:source="$source_namespace">   
        <common>
            <xsl:value-of select="//source:testmij"/>
        </common>
    </xsl:template>

</xsl:stylesheet>

Weet iemand hoe ik dit kan doen ?

Verwijderd

Topicstarter
alsjeblieft ?

Verwijderd

Ehhh, kijk eens naar de functie "local-name", die geeft je de element naam *zonder* de namespace prefix.