Variabele in XML omzetten dmv XSLT

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • FaceDown
  • Registratie: Juni 2003
  • Laatst online: 08-07 23:54

FaceDown

Storende factor.

Topicstarter
Disclaimer; ik ben (helaas) geen XML-goeroe ;) Voor een interface lezen we een XML-bericht in, dat normaliter eenvoudig gestructureerd is, bijv:

<Klant>
<ID>123</ID>
<Naam>Pietje</Naam>
</Klant>

Dit inlezen is geen probleem. Echter nu krijgen we de volgende structuur binnen:

<Klant ID='123'>
<Naam>Pietje</Naam>
</Klant>

En ons systeem kan helaas niet overweg met de variabele ID. Nu wil ik die dus mbv een XSLT converteren naar het eerste voorbeeld. Ik kom er echter niet aan uit hoe dit te doen. Kan iemand mij helpen om de juiste XSLT-functie te maken om dit voor elkaar te boxen? Mijn dank is oneindig!

EDIT: Heb nu zoiets, maar dat wil niet werken:

<xsl:template match="Klant">
<ID><xsl:apply-templates/>
<xsl:value-of select="../@ID"/></ID><br/>
</xsl:template>

[ Voor 12% gewijzigd door FaceDown op 11-03-2016 12:03 ]

Groetjes, FaceDown.


Acties:
  • +2 Henk 'm!

  • emnich
  • Registratie: November 2012
  • Niet online

emnich

kom je hier vaker?

FaceDown schreef op vrijdag 11 maart 2016 @ 11:52:
Disclaimer; ik ben (helaas) geen XML-goeroe ;) Voor een interface lezen we een XML-bericht in, dat normaliter eenvoudig gestructureerd is, bijv:

<Klant>
<ID>123</ID>
<Naam>Pietje</Naam>
</Klant>

Dit inlezen is geen probleem. Echter nu krijgen we de volgende structuur binnen:

<Klant ID='123'>
<Naam>Pietje</Naam>
</Klant>

En ons systeem kan helaas niet overweg met de variabele ID. Nu wil ik die dus mbv een XSLT converteren naar het eerste voorbeeld. Ik kom er echter niet aan uit hoe dit te doen. Kan iemand mij helpen om de juiste XSLT-functie te maken om dit voor elkaar te boxen? Mijn dank is oneindig!

EDIT: Heb nu zoiets, maar dat wil niet werken:

<xsl:template match="Klant">
<ID><xsl:apply-templates/>
<xsl:value-of select="../@ID"/></ID><br/>
</xsl:template>
even quick-and-dirty
code:
1
2
3
4
5
6
7
8
9
10
<xsl:template match="Klant">
<Klant>
<ID><xsl:value-of select="@ID"/></ID>
<xsl:apply-templates/>
</Klant>
</xsl:template>

<xsl:template match="*">
<xsl:copy-of select="."/>
</xsl:template>

Acties:
  • 0 Henk 'm!

  • FaceDown
  • Registratie: Juni 2003
  • Laatst online: 08-07 23:54

FaceDown

Storende factor.

Topicstarter
Bedankt voor je antwoord echter het lijkt nog niet te werken. Is er een eenvoudige manier om de output van een XML + XSLT te zien?

Groetjes, FaceDown.


Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 15:24

Cyphax

Moderator LNX
FaceDown schreef op donderdag 17 maart 2016 @ 09:39:
Bedankt voor je antwoord echter het lijkt nog niet te werken. Is er een eenvoudige manier om de output van een XML + XSLT te zien?
Kan je op meerdere manieren doen:
* In je XML de koppeling maken met de XSL en dan de XML in IE of een andere browser openen
* Notepad++ met XML-plugin
* XML Copy Editor

Je kan in de snippet van emnich proberen dit aan te passen als het niet lukt:
XML:
1
2
3
<xsl:template match="*">
    <xsl:apply-templates />
</xsl:template>

Zou verder moeten werken als ik dat zo zie.

[ Voor 20% gewijzigd door Cyphax op 17-03-2016 09:51 ]

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

  • FaceDown
  • Registratie: Juni 2003
  • Laatst online: 08-07 23:54

FaceDown

Storende factor.

Topicstarter
XML copy editor werkt goed!

Maar ik word gek.. ik krijg het gewoonweg niet werkend. Misschien is het handiger als ik de echte files hier laat zien, want een versimpeld voorbeeld is helaas te lastig voor mij blijkbaar :')

Hopelijk kunnen jullie me helpen!

De originele file:

code:
1
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><manageTradeCardsResponse xmlns="http://schemas.nav.gov.hu/EKAER/1.0/ekaermanagement" xmlns:ns2="http://schemas.nav.gov.hu/EKAER/1.0/common"><header><requestId>WIPA010656</requestId><timestamp>2016-02-12T10:28:56</timestamp><requestVersion>1.9</requestVersion><headerVersion>1.0</headerVersion></header><result><funcCode>OK</funcCode><reasonCode>SUCCESS</reasonCode></result><tradeCardOperationsResults><operationResult><result><funcCode>OK</funcCode><reasonCode>SUCCESS</reasonCode><index>1</index><operation>create</operation></result><tradeCardInfo><tcn>E1602120BA248E7</tcn><orderNumber>WIPA010656</orderNumber><tradeType>I</tradeType><isSellerDelivery>true</isSellerDelivery><modByCarrierEnabled>false</modByCarrierEnabled><isIntermodal>true</isIntermodal><sellerName>blablabla GmbH </sellerName><sellerVatNumber>DE8xxx1</sellerVatNumber><sellerCountry>DE</sellerCountry><sellerAddress>DE 69xx12 Eberbach Uferstrasse 7 </sellerAddress><destinationName>Partner in Pet Food Hungaria</destinationName><destinationVatNumber>1xxxx463</destinationVatNumber><destinationCountry>HU</destinationCountry><destinationAddress>2040 Budaörs Puskás T.u. 14.</destinationAddress><unloadReporter>S</unloadReporter><vehicle><plateNumber>MGY485</plateNumber><country>H</country></vehicle><vehicle2><plateNumber>XVL263</plateNumber><country>H</country></vehicle2><arrivalDate>2016-02-16T00:00:00+01:00</arrivalDate><tradeCardType>N</tradeCardType><deliveryPlans><deliveryPlan id="195A4I8TT6UE"><items><tradeCardItem id="195A4I8XHRUF"><tradeReason>S</tradeReason><productVtsz>2301</productVtsz><productName>Húsliszt Mixed 50 Pork 50 Beef mbm 52%</productName><weight>19890</weight><value>1343285</value><valueModReasonText>Új tétel rögzítése</valueModReasonText><weightModReasonText>Új tétel rögzítése</weightModReasonText><batchNumber>LWE16/03785</batchNumber><insDate>2016-02-12T10:29:02+01:00</insDate><insUser>mlosonczi</insUser><modDate>2016-02-12T10:29:02+01:00</modDate></tradeCardItem></items><loadLocation><name>xxxxxxx GMBH</name><VATNumber>DE8xx</VATNumber><email>NO@EMAIL.COM</email><country>DE</country><zipCode>8xxx0</zipCode><city>MEMMINGEN</city><street>xxxxx 44</street><lotNumber>321</lotNumber></loadLocation><unloadLocation><name>xxxxxxxxxD HUNGÁRIA</name><VATNumber>118xxx3</VATNumber><phone>+3600000000</phone><email>LAPRO@xxxxPE.COM</email><country>HU</country><zipCode>9xx3</zipCode><city>SOxxxxCS</city><street>F&#336; UTCA xx. </street><lotNumber>321</lotNumber></unloadLocation></deliveryPlan></deliveryPlans><VATNumber>11854463</VATNumber><status>S</status><totalWeight>19890</totalWeight><totalValue>1343285</totalValue><totalAssuranceLocked>0</totalAssuranceLocked><insDate>2016-02-12T10:29:02+01:00</insDate><tcnValidityStart>2016-02-12+01:00</tcnValidityStart><tcnValidityEnd>2016-02-27+01:00</tcnValidityEnd><insUser>mlosonczi</insUser><modUser>mlxxxzi</modUser><modDate>2016-02-12T10:29:02+01:00</modDate></tradeCardInfo></operationResult></tradeCardOperationsResults></manageTradeCardsResponse>


Het resultaat nu (met de originele XSLT):

code:
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
<?xml version="1.0" encoding="UTF-8"?>
<ti:xml xmlns:ti="http://www.to-increase.com/data/blocks">
  <ti:blocks>
    <ti:block id="manageTradeCardsResponse">
      <ti:members/>
      <ti:blocks>
        <ti:block id="header">
          <ti:members>
            <ti:member id="requestId">WIPA010656</ti:member>
            <ti:member id="timestamp">2016-02-12T10:28:56</ti:member>
            <ti:member id="requestVersion">1.9</ti:member>
            <ti:member id="headerVersion">1.0</ti:member>
          </ti:members>
          <ti:blocks/>
        </ti:block>
        <ti:block id="result">
          <ti:members>
            <ti:member id="funcCode">OK</ti:member>
            <ti:member id="reasonCode">SUCCESS</ti:member>
          </ti:members>
          <ti:blocks/>
        </ti:block>
        <ti:block id="tradeCardOperationsResults">
          <ti:members/>
          <ti:blocks>
            <ti:block id="operationResult">
              <ti:members/>
              <ti:blocks>
                <ti:block id="result">
                  <ti:members>
                    <ti:member id="funcCode">OK</ti:member>
                    <ti:member id="reasonCode">SUCCESS</ti:member>
                    <ti:member id="index">1</ti:member>
                    <ti:member id="operation">create</ti:member>
                  </ti:members>
                  <ti:blocks/>
                </ti:block>
                <ti:block id="tradeCardInfo">
                  <ti:members>
                    <ti:member id="tcn">E1602120BA248E7</ti:member>
                    <ti:member id="orderNumber">WIPA010656</ti:member>
                    <ti:member id="tradeType">I</ti:member>
                    <ti:member id="isSellerDelivery">true</ti:member>
                    <ti:member id="modByCarrierEnabled">false</ti:member>
                    <ti:member id="isIntermodal">true</ti:member>
                    <ti:member id="sellerName">xxxxxx GmbH </ti:member>
                    <ti:member id="sellerVatNumber">DE8xxx01</ti:member>
                    <ti:member id="sellerCountry">DE</ti:member>
                    <ti:member id="sellerAddress">DE 6xxxx2 xxxxxxx </ti:member>
                    <ti:member id="destinationName">xxxxxxxxxx</ti:member>
                    <ti:member id="destinationVatNumber">11xxxxx3</ti:member>
                    <ti:member id="destinationCountry">HU</ti:member>
                    <ti:member id="destinationAddress">xxxxxxxxxxx.</ti:member>
                    <ti:member id="unloadReporter">S</ti:member>
                    <ti:member id="arrivalDate">2016-02-16T00:00:00+01:00</ti:member>
                    <ti:member id="tradeCardType">N</ti:member>
                    <ti:member id="VATNumber">11xxxx3</ti:member>
                    <ti:member id="status">S</ti:member>
                    <ti:member id="totalWeight">19890</ti:member>
                    <ti:member id="totalValue">1343285</ti:member>
                    <ti:member id="totalAssuranceLocked">0</ti:member>
                    <ti:member id="insDate">2016-02-12T10:29:02+01:00</ti:member>
                    <ti:member id="tcnValidityStart">2016-02-12+01:00</ti:member>
                    <ti:member id="tcnValidityEnd">2016-02-27+01:00</ti:member>
                    <ti:member id="insUser">mlosonczi</ti:member>
                    <ti:member id="modUser">mlosonczi</ti:member>
                    <ti:member id="modDate">2016-02-12T10:29:02+01:00</ti:member>
                  </ti:members>
                  <ti:blocks>
                    <ti:block id="vehicle">
                      <ti:members>
                        <ti:member id="plateNumber">MGY485</ti:member>
                        <ti:member id="country">H</ti:member>
                      </ti:members>
                      <ti:blocks/>
                    </ti:block>
                    <ti:block id="vehicle2">
                      <ti:members>
                        <ti:member id="plateNumber">XVL263</ti:member>
                        <ti:member id="country">H</ti:member>
                      </ti:members>
                      <ti:blocks/>
                    </ti:block>
                    <ti:block id="deliveryPlans">
                      <ti:members/>
                      <ti:blocks>
                        <ti:block id="deliveryPlan">
                          <ti:members/>
                          <ti:blocks>
                            <ti:block id="items">
                              <ti:members/>
                              <ti:blocks>
                                <ti:block id="tradeCardItem">
                                  <ti:members>
                                    <ti:member id="tradeReason">S</ti:member>
                                    <ti:member id="productVtsz">2301</ti:member>
                                    <ti:member id="productName">Húsliszt Mixed 50 Pork 50 Beef mbm 52%</ti:member>
                                    <ti:member id="weight">19890</ti:member>
                                    <ti:member id="value">1343285</ti:member>
                                    <ti:member id="valueModReasonText">Új tétel rögzítése</ti:member>
                                    <ti:member id="weightModReasonText">Új tétel rögzítése</ti:member>
                                    <ti:member id="batchNumber">LWE16/03785</ti:member>
                                    <ti:member id="insDate">2016-02-12T10:29:02+01:00</ti:member>
                                    <ti:member id="insUser">mlosonczi</ti:member>
                                    <ti:member id="modDate">2016-02-12T10:29:02+01:00</ti:member>
                                  </ti:members>
                                  <ti:blocks/>
                                </ti:block>
                              </ti:blocks>
                            </ti:block>
                            <ti:block id="loadLocation">
                              <ti:members>
                                <ti:member id="name">xxxxxxxxx GMBH</ti:member>
                                <ti:member id="VATNumber">DExxx01</ti:member>
                                <ti:member id="email">NO@EMAIL.COM</ti:member>
                                <ti:member id="country">DE</ti:member>
                                <ti:member id="zipCode">xxx00</ti:member>
                                <ti:member id="city">MEMMINGEN</ti:member>
                                <ti:member id="street">xxxxxxx 33</ti:member>
                                <ti:member id="lotNumber">321</ti:member>
                              </ti:members>
                              <ti:blocks/>
                            </ti:block>
                            <ti:block id="unloadLocation">
                              <ti:members>
                                <ti:member id="name">xxxxxxxxxxx</ti:member>
                                <ti:member id="VATNumber">11xxx463</ti:member>
                                <ti:member id="phone">+3600000000</ti:member>
                                <ti:member id="email">LAPRO@xxxxxE.COM</ti:member>
                                <ti:member id="country">HU</ti:member>
                                <ti:member id="zipCode">9xx</ti:member>
                                <ti:member id="city">SOPxxxxxACS</ti:member>
                                <ti:member id="street">xxx 68. </ti:member>
                                <ti:member id="lotNumber">321</ti:member>
                              </ti:members>
                              <ti:blocks/>
                            </ti:block>
                          </ti:blocks>
                        </ti:block>
                      </ti:blocks>
                    </ti:block>
                  </ti:blocks>
                </ti:block>
              </ti:blocks>
            </ti:block>
          </ti:blocks>
        </ti:block>
      </ti:blocks>
    </ti:block>
  </ti:blocks>
</ti:xml>


En de huidige XSLT (zonder aanpassingen):

code:
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
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ti="http://www.to-increase.com/data/blocks">

  <xsl:template match="/">
    <ti:xml>
      <xsl:choose>
        <!-- Handle the toplevel List tag differently -->
        <xsl:when test="*[starts-with(local-name(),'ArrayOf')]">
          <ti:blocks>
            <xsl:apply-templates select="*[starts-with(local-name(),'ArrayOf')]/*[*]"/>
          </ti:blocks>
        </xsl:when>
        <xsl:otherwise>
          <ti:blocks>
            <xsl:apply-templates select="*[*]"/>
          </ti:blocks>
        </xsl:otherwise>
      </xsl:choose>
    </ti:xml>
  </xsl:template>
  
  <!-- match a node with only text content -->
  <xsl:template match="*[not(*)]">
    <ti:member id="{local-name()}">
      <xsl:value-of select="."/>
    </ti:member>
  </xsl:template>
  
  <!-- Match a node with a child node-->
  <xsl:template match="*[*]">
    <ti:block id="{local-name()}">
      <ti:members>
        <xsl:apply-templates select="*[not(*)]"/>
      </ti:members>
      <ti:blocks>
        <xsl:apply-templates select="*[*]"/>
      </ti:blocks>
    </ti:block>
  </xsl:template>

</xsl:stylesheet>


Wat ik dus voor mekaar wil krijgen is om de deliveryPlan id xxxxx weer te geven als
<ti:member id="ID">xxxxx</ti:member>
onder deliveryPlan

En hetzelfde voor tradeCardItem id=xxxxx (maar dan onder tradeCardItem).

Mijn dank is oneindig voor degene die dit weet te tackelen _/-\o_

Groetjes, FaceDown.


Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 15:24

Cyphax

Moderator LNX
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
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ti="http://www.to-increase.com/data/blocks">

  <xsl:template match="/">
    <ti:xml>
      <xsl:choose>
        <!-- Handle the toplevel List tag differently -->
        <xsl:when test="*[starts-with(local-name(),'ArrayOf')]">
          <ti:blocks>
            <xsl:apply-templates select="*[starts-with(local-name(),'ArrayOf')]/*[*]"/>
          </ti:blocks>
        </xsl:when>
        <xsl:otherwise>
          <ti:blocks>
            <xsl:apply-templates select="*[*]"/>
          </ti:blocks>
        </xsl:otherwise>
      </xsl:choose>
    </ti:xml>
  </xsl:template>
  
  <!-- match a node with only text content -->
  <xsl:template match="*[not(*)]">
    <ti:member id="{local-name()}">
      <xsl:value-of select="."/>
    </ti:member>
  </xsl:template>
  
  <!-- Match a node with a child node-->
  <xsl:template match="*[*]">
    <ti:block id="{local-name()}">
      <ti:members>
        <xsl:if test="local-name() = 'deliveryPlan' or local-name() = 'tradeCardItem'">
            <ti:member>
                <xsl:attribute name="id">ID</xsl:attribute>
                <xsl:value-of select="@id"/>
            </ti:member>
        </xsl:if>
        <xsl:apply-templates select="*[not(*)]"/>
      </ti:members>
      <ti:blocks>
        <xsl:apply-templates select="*[*]"/>
      </ti:blocks>
    </ti:block>
  </xsl:template>

</xsl:stylesheet>

Zoiets? Ik weet niet helemaal zeker of ik je goed begrijp maar dan krijg je dus:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<ti:block id="deliveryPlans">
    <ti:members/>
    <ti:blocks>
        <ti:block id="deliveryPlan">
            <ti:members>
                <ti:member id="ID">195A4I8TT6UE</ti:member>
            </ti:members>
            <ti:blocks>
                <ti:block id="items">
                    <ti:members/>
                    <ti:blocks>
                        <ti:block id="tradeCardItem">
                            <ti:members>
                                <ti:member id="ID">195A4I8XHRUF</ti:member>
                                <ti:member id="tradeReason">S</ti:member>
                                <ti:member id="productVtsz">2301</ti:member>
[..]

[ Voor 7% gewijzigd door Cyphax op 17-03-2016 23:00 ]

Saved by the buoyancy of citrus

Pagina: 1