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
Mijn "functions" XSL
En tot slot de "crossdata", waar de lookup staat
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'
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="'ÀÂÄÅæÆÇÉÈÊËÏÔÖØßÙÛÜÑ .:,;+_-#@/\&<>"'"/> <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'