IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XSL/XSLT/XPATH XML Discussion :

[XSLT] Convertion XML/JSON


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 42
    Points : 26
    Points
    26
    Par défaut [XSLT] Convertion XML/JSON
    Bonjour à tous, je voudrais convertir un document XML en document JSON par l'intermédiaire d'une feuille XSLT. Et en fait après un premier jet de feuille XSLT je n'arrive pas à savoir quoi modifier pour aboutir au résultat suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    {
    	"version": "1.0", 
    	"encoding": "UTF-8",
    	"feed": 
    		{ 
    			"xmlns": "http://www.w3.org/2005/Atom",
    			"xmlns$openSearch": "http://a9.com/-/spec/opensearchrss/1.0/",
    			"id": 
    				{ 
    					"value": "http://www.termsciences.fr/services/opensearch/search.php" 
    				},
    			"updated": 
    				{ 
    					"value": "2010-06-07T09:40:58Z" 
    				},
    			"title": 
    				{ 
    					"type": "text",
    					"value": "Recherche TermSciences : tomate" 
    				},
    			"link":[ 
    				{ 
    					"rel": "self",
    					"type": "application/jsonrequest",
    					"href": "http://www.termsciences.fr/services/opensearch/search.php?query%3Dtomate%26lang%3Den%26field%3DTERMFR%26step%3D10%26start%3D1%26input-encoding%3DUTF-8" 
    				}, 
    				{ 
    					"rel": "related",
    					"type": "application/opensearchdescription+xml",
    					"href": "http://www.termsciences.fr/services/opensearch/search.xml" 
    				}],
    			"openSearch$startIndex": 
    				{ 
    					"value": "1" 
    				},
    			"openSearch$itemsPerPage": 
    				{ 
    					"value": "10" 
    				},
    			"openSearch$totalResults": 
    				{ 
    					"value": "12" 
    				},
    			"openSearch$Query": 
    				{ 
    					"searchTerms": "tomate",
    					"startPage": "1" 
    				},
    			"content": 
    				{ 
    					"type": "text" 
    				},
    			"entry":[ 
    				{ 
    					"id": 
    						{ 
    							"value": "urn:termsciences:TE.80342" 
    						},
    					"updated": 
    						{ 
    							"value": "2006-06-13T00:00:00Z" 
    						},
    					"title": 
    						{ 
    							"type": "text",
    							"value": "Tomato" 
    						},
    					"content": 
    						{ 
    							"type": "text",
    							"value": "Tomato, Tomatoes" 
    						},
    					"link":[ 
    						{ 
    							"type": "text/html",
    							"href": "http://www.termsciences.fr/services/urls/selection/?idt=TE.80342&lng=en" 
    						}] 
    				}, 
    				{ 
    					"id": 
    						{ 
    							"value": "urn:termsciences:TE.84492" 
    						},
    					"title": 
    						{ 
    							"value": "Tomato black ring virus",
    							"type": "text" 
    						},
    					"updated": 
    						{ 
    							"value": "2006-04-05T00:00:00Z" 
    						},
    					"link":[ 
    						{ 
    							"type": "text/html",
    							"href": "http://www.termsciences.fr/services/urls/selection/?idt=TE.84492&lng=en" 
    						}],
    					"content": 
    						{ 
    							"value": "Tomato black ring virus",
    							"type": "text" 
    						} 
    				}] 
    		}			
    }
    J'ai donc le document XML suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet href="xmlToJson.xsl" type="text/xsl" ?>
    <feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">
    	<id>http://www.termsciences.fr/services/opensearch/search.php</id>
    	<updated>2010-04-13T10:19:35Z</updated>
    	<title type="text">Recherche TermSciences : tomate</title>
    	<link rel="self" type="application/atom+xml" href="http://www.termsciences.fr/services/opensearch/search.php?query%3Dtomate%26lang%3Den%26field%3DTERMFR%26step%3D10%26start%3D1%26input-encoding%3DUTF-8"/>
    	<link rel="related" type="application/opensearchdescription+xml" href="http://www.termsciences.fr/services/opensearch/search.xml"/>
    	<openSearch:startIndex>1</openSearch:startIndex>
    	<openSearch:itemsPerPage>10</openSearch:itemsPerPage>
    	<openSearch:totalResults>12</openSearch:totalResults>
    	<openSearch:Query searchTerms="tomate" startPage="1"/>
    	<content type="text"/>
    		<entry>
    			<id>urn:termsciences:TE.80342</id>
    			<updated>2006-06-13T00:00:00Z</updated>
    			<title type="text">Tomato</title>
    			<content type="text">Tomato,	Tomatoes</content>
    			<link type="text/html" href="http://www.termsciences.fr/services/urls/selection/?idt=TE.80342&amp;lng=en"/>
    		</entry>
    		<entry>
    			<id>urn:termsciences:TE.84492</id>
    			<title type="text">Tomato black ring virus</title>
    			<updated>2006-04-05T00:00:00Z</updated>
    			<link type="text/html" href="http://www.termsciences.fr/services/urls/selection/?idt=TE.84492&amp;lng=en"/>
    			<content type="text">Tomato black ring virus</content>
    		</entry>
    </feed>
    et la feuille XSLT suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:ebl="urn:ebay:apis:eBLBaseComponents" exclude-result-prefixes="ebl">
     
    	<xsl:output method="text" encoding="UTF-8"/>
    	<xsl:strip-space elements="*"/>
    	<xsl:template match="*">
    		<xsl:param name="recursionCnt">0</xsl:param>
    		<xsl:param name="isLast">1</xsl:param>
    		<xsl:param name="inArray">0</xsl:param>
    		<xsl:if test="$recursionCnt=0">
    			<xsl:text>{</xsl:text>
    		</xsl:if>
    		<!-- test what type of data to output  -->
    		<xsl:variable name="elementDataType">
    			<xsl:value-of select="number(text())"/>
    		</xsl:variable>
    		<xsl:variable name="elementData">
    			<!-- TEXT ( use quotes ) -->
    			<xsl:if test="string($elementDataType) ='NaN'">
    				<xsl:if test="boolean(text())">
    				<xsl:text/>"<xsl:value-of select="text()"/>"<xsl:text/>
    				</xsl:if>
    			</xsl:if>
    			<!-- NUMBER (no quotes ) -->
    			<xsl:if test="string($elementDataType) !='NaN'">
    				<xsl:text/><xsl:value-of select="text()"/><xsl:text/>
    			</xsl:if>
    			<!-- NULL -->
    			<xsl:if test="not(*)">
    				<xsl:if test="not(text())">
    					<xsl:text/>null<xsl:text/>
    				</xsl:if>
    			</xsl:if>
    		</xsl:variable>
    		<xsl:variable name="hasRepeatElements">
    			<xsl:for-each select="*">
    				<xsl:if test="name() = name(preceding-sibling::*) or name() = name(following-sibling::*)">
    					<xsl:text/>true<xsl:text/>
    				</xsl:if>
    			</xsl:for-each>
    		</xsl:variable>
    		<xsl:if test="not(count(@*) &gt; 0)">
    		 <xsl:text/>"<xsl:value-of select="local-name()"/>":<xsl:value-of select="$elementData"/><xsl:text/>
    		</xsl:if>
    		<xsl:if test="count(@*) &gt; 0">
    		<xsl:text/>"<xsl:value-of select="local-name()"/>":{"value":<xsl:value-of select="$elementData"/><xsl:text/>
    			<xsl:for-each select="@*">
    				<xsl:if test="position()=1">,</xsl:if>
    				<!-- test what type of data to output  -->
    				<xsl:variable name="dataType">
    					<xsl:text/><xsl:value-of select="number(.)"/><xsl:text/>
    				</xsl:variable>
    				<xsl:variable name="data">
    					<!-- TEXT ( use quotes ) -->
    					<xsl:if test="string($dataType) ='NaN'">
    				<xsl:text/>"<xsl:value-of select="current()"/>"<xsl:text/> </xsl:if>
    					<!-- NUMBER (no quotes ) -->
    					<xsl:if test="string($dataType) !='NaN'">
    						<xsl:text/><xsl:value-of select="current()"/><xsl:text/>
    					</xsl:if>
    				</xsl:variable>
    				<xsl:text/><xsl:value-of select="local-name()"/>:<xsl:value-of select="$data"/><xsl:text/>
    				<xsl:if test="position() !=last()">,</xsl:if>
    			</xsl:for-each>
    		<xsl:text/>}<xsl:text/>
    		</xsl:if>
    		<xsl:if test="not($hasRepeatElements = '')">
    					<xsl:text/>[{<xsl:text/>
    				</xsl:if>
    		<xsl:for-each select="*">
    			<xsl:if test="position()=1">
    				<xsl:if test="$hasRepeatElements = ''">
    					<xsl:text>{</xsl:text>
    				</xsl:if>
    			</xsl:if>
    			<xsl:apply-templates select="current()">
    				<xsl:with-param name="recursionCnt" select="$recursionCnt+1"/>
    				<xsl:with-param name="isLast" select="position()=last()"/>
    				<xsl:with-param name="inArray" select="not($hasRepeatElements = '')"/>
    			</xsl:apply-templates>
    			<xsl:if test="position()=last()">
    				<xsl:if test="$hasRepeatElements = ''">
    					<xsl:text>}</xsl:text>
    				</xsl:if>
    			</xsl:if>
    		</xsl:for-each>
    		<xsl:if test="not($hasRepeatElements = '')">
    					<xsl:text/>}]<xsl:text/>
    				</xsl:if>
    		<xsl:if test="not( $isLast )">
    			<xsl:if test="$inArray = 'true'">
    				<xsl:text>}</xsl:text>
    			</xsl:if>
    			<xsl:text/>,<xsl:text/>
    			<xsl:if test="$inArray = 'true'">
    				<xsl:text>{</xsl:text>
    			</xsl:if>
    		</xsl:if>
    		<xsl:if test="$recursionCnt=0">}</xsl:if>
    	</xsl:template>
    </xsl:stylesheet>
    Que dois-je modifier ??

    Merci d'avance

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    Hm. Je sais pas pour les autres, mais moi c'est même pas la peine d'espérer que je vais essayer de lire et tester tout ce code pour comprendre d'une part où est le problème, d'autre part que modifier pour le résoudre.
    Au minimum il faut nous décrire ce qui ne convient pas avec ce qu'il y a là. Mais bon, ceci mis à part :

    Moi je ne transformerais pas du XML en JSON avec un XSLT. C'est faisable mais bien trop imprudent, avec les échappements de chaîne et tout. Il vaut mieux se faire un programme dédié, qui lit du XML d'un côté, écrit du JSON de l'autre, et fait un petit bout de glue entre les deux pour transformer l'arbre XML en arbre JSON.
    En Java, ce serait plutôt simple. Je m'attends à ce que ce le soit dans les autres langages.

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Points : 1 610
    Points
    1 610
    Par défaut
    J'avais jeté un oeil et commencer à modifier le xsl-t, mais ça bien galère en effet.
    Et puis là, tu traite les déclaration de préfixes et namespace comme des attributs, ainsi que l'entête XML comme élément racine.
    Juste un détail pour commencer, enlève :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:strip-space elements="*"/>
    si tu veux produire de l'indentation en sortie.

    Ensuite, c'est vrai qu'en java, il y a déjà pas mal de librairies qui font du binding XML<->Java et Java<->JSon.
    C'est peut être plus simple de s'appuyer sur ces mécanismes.

    Sinon, en cherchant sur google on trouve des pistes :
    http://code.google.com/p/xml2json-xslt/
    http://www.thomasfrank.se/xml_to_json.html

Discussions similaires

  1. convert xml to tex with xslt
    Par raw86 dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 11/10/2011, 23h39
  2. [XSLT] Convertion XML en WBXML
    Par wisstr dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 02/08/2006, 11h37
  3. Réponses: 6
    Dernier message: 21/07/2006, 09h18
  4. [XSLT] Arbre XML -> Arbre HTML
    Par FT dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 29/09/2004, 09h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo