Cookies op Tweakers

Tweakers is onderdeel van DPG Media en maakt gebruik van cookies, JavaScript en vergelijkbare technologie om je onder andere een optimale gebruikerservaring te bieden. Ook kan Tweakers hierdoor het gedrag van bezoekers vastleggen en analyseren. Door gebruik te maken van deze website, of door op 'Cookies accepteren' te klikken, geef je toestemming voor het gebruik van cookies. Wil je meer informatie over cookies en hoe ze worden gebruikt? Bekijk dan ons cookiebeleid.

Meer informatie
Toon posts:

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

Pagina: 1
Acties:

Vraag


  • ArcticTiger
  • Registratie: oktober 2003
  • Laatst online: 20:59
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'


Apple iPad Pro (2021) 11" Wi-Fi, 8GB ram Microsoft Xbox Series X LG CX Google Pixel 5a 5G Sony XH90 / XH92 Samsung Galaxy S21 5G Sony PlayStation 5 Nintendo Switch Lite

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2021 Hosting door True