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.
CTRL+C pour copier, CTRL+V pour coller
1
<?xml version="1.0" encoding="UTF-8" ?>
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>
<?xml version="1.0" encoding="UTF-8" ?> <person> <firstName>John</firstName> <lastName>Smith</lastName> <age>22</age> <address> <streetAddress>21 2nd Street</streetAddress> <city>New York</city> <state postalCode="10021" name="NY"/> </address> <phoneNumber type="home"> 212 555-1234 </phoneNumber> <phoneNumber type="fax"> 646 555-4567 </phoneNumber> </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
CTRL+C pour copier, CTRL+V pour coller
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
}
{ "firstName": "John", "lastName": "Smith", "age": "25", "address": { "streetAddress": "21 2nd Street", "city": "New York", "state": { "name": "NY", "postalCode": "10021" } }, "phoneNumber": [ { "type": "home", "number": "212 555-1234" }, { "type": "fax", "number": "646 555-4567" } ] }
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
CTRL+C pour copier, CTRL+V pour coller
1
<?xml version="1.0" encoding="UTF-8"?>
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>
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0"> <xsl:output method="text" indent="yes"/> <xsl:template match="person"> <xsl:text>{</xsl:text> ... <xsl:text>}</xsl:text> </xsl:template> </xsl:stylesheet>
Solution
CTRL+C pour copier, CTRL+V pour coller
1
<?xml version="1.0" encoding="UTF-8"?>
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>
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0"> <xsl:output method="text" indent="yes"/> <xsl:template match="person"> <xsl:text>{</xsl:text> <xsl:apply-templates/> <xsl:text>"phoneNumber": [</xsl:text> <xsl:for-each select="phoneNumber"> <xsl:if test="position() != last()"> { <xsl:text>"</xsl:text><xsl:value-of select="name(@*)"/><xsl:text>" : </xsl:text> <xsl:text>"</xsl:text><xsl:value-of select="./@*"/><xsl:text>",</xsl:text> <xsl:text>"number" : "</xsl:text><xsl:value-of select="."/><xsl:text>"</xsl:text> }, </xsl:if> <xsl:if test="position() = last()"> { <xsl:text>"</xsl:text><xsl:value-of select="name(@*)"/><xsl:text>" : </xsl:text> <xsl:text>"</xsl:text><xsl:value-of select="./@*"/><xsl:text>",</xsl:text> <xsl:text>"number" : "</xsl:text><xsl:value-of select="."/><xsl:text>"</xsl:text> } </xsl:if> </xsl:for-each> <xsl:text>]</xsl:text> <xsl:text>}</xsl:text> </xsl:template> <xsl:template match="*"> <xsl:text>"</xsl:text><xsl:value-of select="./name()"/><xsl:text>" : </xsl:text> <xsl:if test="position() != last()"> <xsl:text>"</xsl:text><xsl:value-of select="."/><xsl:text>",</xsl:text> </xsl:if> <xsl:if test="position() = last()"> <xsl:text>"</xsl:text><xsl:value-of select="."/><xsl:text>"</xsl:text> </xsl:if> </xsl:template> <xsl:template match="address"> <xsl:text>"</xsl:text><xsl:value-of select="./name()"/><xsl:text>" : {</xsl:text> <xsl:apply-templates select="*"/> <xsl:text>},</xsl:text> </xsl:template> <xsl:template match="state"> <xsl:text>"</xsl:text><xsl:value-of select="./name()"/><xsl:text>" : </xsl:text> <xsl:text>{</xsl:text> <xsl:for-each select="@*"> <xsl:text>"</xsl:text><xsl:value-of select="name()" /><xsl:text>" : </xsl:text> <xsl:if test="position() != last()"><xsl:text>"</xsl:text><xsl:value-of select="."/><xsl:text>",</xsl:text></xsl:if> <xsl:if test="position() = last()"><xsl:text>"</xsl:text><xsl:value-of select="."/><xsl:text>"</xsl:text></xsl:if> </xsl:for-each> <xsl:text>}</xsl:text> </xsl:template> <xsl:template match="phoneNumber"/> </xsl:stylesheet>