Du XML au JSON
Question
Voici un fichier XML décrivant une personne et ses coordonnées. Transformez cette structure en écrivant son équivalent au format JSON, faites les adaptations et développements nécessaires.
1
2
<person>
3
<firstName>John</firstName>
4
<lastName>Smith</lastName>
5
<age>22</age>
6
<address>
7
<streetAddress>21 2nd Street</streetAddress>
8
<city>New York</city>
9
<state postalCode="10021" name="NY"/>
10
</address>
11
<phoneNumber type="home">
12
212 555-1234
13
</phoneNumber>
14
<phoneNumber type="fax">
15
646 555-4567
16
</phoneNumber>
17
</person>
Indice
En JSON il n'y a pas d'attributs comme en XML, alors que ceux-ci sont parfois plus pratiques pour exprimer une notion de type, par exemple, ou pour nommer une sous-structure sans avoir à ajouter une balise. Il faut les faire figurer autrement lorsque l'on souhaite passer au format JSON.
Solution
1
{
2
"firstName": "John",
3
"lastName": "Smith",
4
"age": "25",
5
"address": {
6
"streetAddress": "21 2nd Street",
7
"city": "New York",
8
"state": {
9
"name": "NY",
10
"postalCode": "10021"
11
}
12
},
13
"phoneNumber": [
14
{
15
"type": "home",
16
"number": "212 555-1234"
17
},
18
{
19
"type": "fax",
20
"number": "646 555-4567"
21
}
22
]
23
}
Question
Créer un document XSLT permettant de transformer ce document XSL en la solution précédente.
Indice
Attention à la gestion des derniers éléments et au tableau.
Indice
1
2
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
3
xmlns:xs="http://www.w3.org/2001/XMLSchema"
4
exclude-result-prefixes="xs"
5
version="2.0">
6
<xsl:output method="text" indent="yes"/>
7
8
<xsl:template match="person">
9
<xsl:text>{</xsl:text>
10
...
11
<xsl:text>}</xsl:text>
12
</xsl:template>
13
14
15
</xsl:stylesheet>
Solution
1
2
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
3
xmlns:xs="http://www.w3.org/2001/XMLSchema"
4
exclude-result-prefixes="xs"
5
version="2.0">
6
<xsl:output method="text" indent="yes"/>
7
8
<xsl:template match="person">
9
<xsl:text>{</xsl:text>
10
<xsl:apply-templates/>
11
<xsl:text>"phoneNumber": [</xsl:text>
12
<xsl:for-each select="phoneNumber">
13
<xsl:if test="position() != last()">
14
{
15
<xsl:text>"</xsl:text><xsl:value-of select="name(@*)"/><xsl:text>" : </xsl:text>
16
<xsl:text>"</xsl:text><xsl:value-of select="./@*"/><xsl:text>",</xsl:text>
17
<xsl:text>"number" : "</xsl:text><xsl:value-of select="."/><xsl:text>"</xsl:text>
18
},
19
</xsl:if>
20
<xsl:if test="position() = last()">
21
{
22
<xsl:text>"</xsl:text><xsl:value-of select="name(@*)"/><xsl:text>" : </xsl:text>
23
<xsl:text>"</xsl:text><xsl:value-of select="./@*"/><xsl:text>",</xsl:text>
24
<xsl:text>"number" : "</xsl:text><xsl:value-of select="."/><xsl:text>"</xsl:text>
25
}
26
</xsl:if>
27
</xsl:for-each>
28
<xsl:text>]</xsl:text>
29
<xsl:text>}</xsl:text>
30
</xsl:template>
31
32
<xsl:template match="*">
33
<xsl:text>"</xsl:text><xsl:value-of select="./name()"/><xsl:text>" : </xsl:text>
34
<xsl:if test="position() != last()">
35
<xsl:text>"</xsl:text><xsl:value-of select="."/><xsl:text>",</xsl:text>
36
</xsl:if>
37
<xsl:if test="position() = last()">
38
<xsl:text>"</xsl:text><xsl:value-of select="."/><xsl:text>"</xsl:text>
39
</xsl:if>
40
</xsl:template>
41
42
43
<xsl:template match="address">
44
<xsl:text>"</xsl:text><xsl:value-of select="./name()"/><xsl:text>" : {</xsl:text>
45
<xsl:apply-templates select="*"/>
46
<xsl:text>},</xsl:text>
47
</xsl:template>
48
49
<xsl:template match="state">
50
<xsl:text>"</xsl:text><xsl:value-of select="./name()"/><xsl:text>" : </xsl:text>
51
<xsl:text>{</xsl:text>
52
<xsl:for-each select="@*">
53
<xsl:text>"</xsl:text><xsl:value-of select="name()" /><xsl:text>" : </xsl:text>
54
<xsl:if test="position() != last()"><xsl:text>"</xsl:text><xsl:value-of select="."/><xsl:text>",</xsl:text></xsl:if>
55
<xsl:if test="position() = last()"><xsl:text>"</xsl:text><xsl:value-of select="."/><xsl:text>"</xsl:text></xsl:if>
56
</xsl:for-each>
57
<xsl:text>}</xsl:text>
58
</xsl:template>
59
60
<xsl:template match="phoneNumber"/>
61
62
</xsl:stylesheet>