Toon posts:

[XSL] key lookup geeft alle waarden terug in plaats van 1

Pagina: 1
Acties:

Vraag


  • ArcticTiger
  • Registratie: Oktober 2003
  • Laatst online: 22:02
Beste allemaal,

ik ben bezig een XSL transformatie op te zetten tussen 2 XML berichten.

Hierin is ook een (vaker door mij gebruikte) functie opgenomen die een lookup doet op basis van een key.
In eerdere projecten is dit altijd goed gegaan, echter nu retourneert deze lookup niet de gevraagde waarde, maar alle waardes.

Als ik bijvoorbeeld 'cl' ingeef, wil ik 'co' terugkrijgen.

Ik heb al diverse mogelijkheden bekeken, tot aan de namespaces aan toe, wellicht heb ik iets over het hoofd gezien?
(Wellicht een fris paar ogen met kennis aanwezig? :) )

Dit is mijn "main" XSL (ik heb de zaken die wel werken, en wat bedrijfsgevoelige data, eruit geknipt
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
<?xml version='1.0'?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:out="logistics/klic/manifest-out" xmlns="logistics/klic/manifest" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:yss="yss:yss" xmlns:cd="cd:cd" exclude-result-prefixes="out cd yss">
    <xsl:import href="../crossdata/crossdata.xsl"/>
    <xsl:import href="functions.xsl"/>
    <xsl:param name="pEdiCustomerNumber" select="'100001'"/>
    <xsl:param name="pEdiCustomerDepartment" select="'500s'"/>
    <xsl:output method="xml" indent="yes" encoding="UTF-8"/>
    <xsl:variable name="specialcase" select="&apos;ÀÂÄÅæÆÇÉÈÊËÏÔÖØßÙÛÜÑ .:,;+_-#@/\&amp;&lt;&gt;&quot;&apos;"/>
    <xsl:variable name="translationcase" select="'AAAAAACEEEEIOOOSUUUN'"/>
    
    <xsl:strip-space elements="*"/>

    <xsl:template match="*">
        <xsl:element name="{local-name()}">
            <xsl:apply-templates select="@*|node()"/>
        </xsl:element>
    </xsl:template>
    <!-- copy all attributes -->
    <xsl:template match="@*">
        <xsl:copy/>
    </xsl:template>

    <!-- Crossdata collicodes -->
    <xsl:template match="out:packageCode">
        <packageCode>
            <xsl:value-of select="yss:translate('yspkgc',.)"/>
        </packageCode>
    </xsl:template>

</xsl:stylesheet>


Mijn "functions" XSL
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
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet
 version="2.0" 
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
 xmlns:fo="http://www.w3.org/1999/XSL/Format" 
 xmlns:cd="cd:cd" 
 xmlns:yss="yss:yss" 
 exclude-result-prefixes="cd yss fo">

    <!-- Crossdata converter 
         Conversion tables:
             pKeyName : name of lookup (or name kewill conversion table ysBX01 - ysBX0n)
             pValue   : value to be translated
    -->
    <xsl:function name="yss:translate">
        <xsl:param name="pKeyName"/>
        <xsl:param name="pValue"/>
        <xsl:apply-templates select="$cd:crossdata">
            <xsl:with-param name="lookupkey" select="concat('lookup-', $pKeyName)"/>
            <xsl:with-param name="value" select="$pValue"/>
        </xsl:apply-templates>
    </xsl:function>

    <!-- 
        Determine the search name 
    -->
    <xsl:function name="yss:getsearchname">
        <xsl:param name="pNode"/>
        <xsl:variable name="vName">
            <xsl:value-of select="translate(upper-case($pNode/Name),$specialcase,$translationcase)"/>
        </xsl:variable>
        <xsl:variable name="vCity">
            <xsl:value-of select="translate(upper-case($pNode/Address/City),$specialcase,$translationcase)"/>
        </xsl:variable>
        <xsl:value-of select="concat(substring($vName,1,10), substring($vCity,1,10))"/>
    </xsl:function>
</xsl:stylesheet>


En tot slot de "crossdata", waar de lookup staat
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:cd="cd:cd" version="1.0">
  <xsl:variable name="cd:crossdata" select="document('')/*/cd:crossdata"/>
  <xsl:key name="lookup-yspkgc" match="cd:crossdata/cd:yspkgc/cd:row" use="cd:sourcevalue"/>
  <xsl:template match="cd:crossdata">
    <xsl:param name="lookupkey"/>
    <xsl:param name="value"/>
    <xsl:variable name="result">
      <xsl:value-of select="key($lookupkey, $value)/cd:targetvalue"/>
    </xsl:variable>
    <xsl:choose>
      <xsl:when test="$result and $result != ''">
        <xsl:value-of select="$result"/>
      </xsl:when>
      <xsl:otherwise>
        <!-- Lookup not found, return origional value -->
        <!--xsl:value-of select="$value"/-->
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
  <cd:crossdata>
    <cd:yspkgc>
      <cd:row>
        <cd:sourcevalue>ip</cd:sourcevalue>
        <cd:targetvalue>ip</cd:targetvalue>
      </cd:row>
      <cd:row>
        <cd:sourcevalue>tk</cd:sourcevalue>
        <cd:targetvalue>ta</cd:targetvalue>
      </cd:row>
      <cd:row>
        <cd:sourcevalue>rl</cd:sourcevalue>
        <cd:targetvalue>ro</cd:targetvalue>
      </cd:row>
      <cd:row>
        <cd:sourcevalue>st</cd:sourcevalue>
        <cd:targetvalue>pc</cd:targetvalue>
      </cd:row>
      <cd:row>
        <cd:sourcevalue>IB</cd:sourcevalue>
        <cd:targetvalue>ib</cd:targetvalue>
      </cd:row>
      <cd:row>
        <cd:sourcevalue>lo</cd:sourcevalue>
        <cd:targetvalue>ft</cd:targetvalue>
      </cd:row>
      <cd:row>
        <cd:sourcevalue>ep</cd:sourcevalue>
        <cd:targetvalue>ep</cd:targetvalue>
      </cd:row>
      <cd:row>
        <cd:sourcevalue>vt</cd:sourcevalue>
        <cd:targetvalue>dr</cd:targetvalue>
      </cd:row>
      <cd:row>
        <cd:sourcevalue>ct</cd:sourcevalue>
        <cd:targetvalue>ct</cd:targetvalue>
      </cd:row>
      <cd:row>
        <cd:sourcevalue>ks</cd:sourcevalue>
        <cd:targetvalue>cs</cd:targetvalue>
      </cd:row>
      <cd:row>
        <cd:sourcevalue>kr</cd:sourcevalue>
        <cd:targetvalue>cr</cd:targetvalue>
      </cd:row>
      <cd:row>
        <cd:sourcevalue>cl</cd:sourcevalue>
        <cd:targetvalue>co</cd:targetvalue>
      </cd:row>
      <cd:row>
        <cd:sourcevalue>hs</cd:sourcevalue>
        <cd:targetvalue>cl</cd:targetvalue>
      </cd:row>
      <cd:row>
        <cd:sourcevalue>bu</cd:sourcevalue>
        <cd:targetvalue>bu</cd:targetvalue>
      </cd:row>
      <cd:row>
        <cd:sourcevalue>bp</cd:sourcevalue>
        <cd:targetvalue>bp</cd:targetvalue>
      </cd:row>
      <cd:row>
        <cd:sourcevalue>ba</cd:sourcevalue>
        <cd:targetvalue>ba</cd:targetvalue>
      </cd:row>
      <cd:row>
        <cd:sourcevalue>ta</cd:sourcevalue>
        <cd:targetvalue>tk</cd:targetvalue>
      </cd:row>
      <cd:row>
        <cd:sourcevalue>ro</cd:sourcevalue>
        <cd:targetvalue>rl</cd:targetvalue>
      </cd:row>
      <cd:row>
        <cd:sourcevalue>pl</cd:sourcevalue>
        <cd:targetvalue>pl</cd:targetvalue>
      </cd:row>
      <cd:row>
        <cd:sourcevalue>pc</cd:sourcevalue>
        <cd:targetvalue>st</cd:targetvalue>
      </cd:row>
      <cd:row>
        <cd:sourcevalue>ib</cd:sourcevalue>
        <cd:targetvalue>IB</cd:targetvalue>
      </cd:row>
      <cd:row>
        <cd:sourcevalue>ft</cd:sourcevalue>
        <cd:targetvalue>lo</cd:targetvalue>
      </cd:row>
    </cd:yspkgc>
  </cd:crossdata>
</xsl:stylesheet>


Wat er gebeurt:
als ik de functie yss:translate aanroep, krijg ik niet 1, maar alle waarden terug.
Dus bij een input van 'cl' krijg ik geen 'co', maar 'ipiptktarlrostpcIBibloftepepvtdrctctkscskrcrclcohsclbububpbpbabatatkrorlplplpcstibIBftlo'


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee