comparison xslt/json.xsl @ 12:191b81b2052b

first version of the xslt transform from xml to json
author cin
date Mon, 09 Apr 2018 06:43:46 +0300
parents 14162f9133a1
children 197a850b1f6f
comparison
equal deleted inserted replaced
11:14162f9133a1 12:191b81b2052b
1 <?xml version="1.0" encoding="UTF-8"?> 1 <?xml version="1.0" encoding="UTF-8"?>
2 <xsl:stylesheet version="1.0" 2 <xsl:stylesheet version="1.0"
3 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 3 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5 xmlns:exsl="http://exslt.org/common">
5 <xsl:output method="text" /> 6 <xsl:output method="text" />
7
8 <xsl:key name="members" match="*" use="concat(generate-id(..),local-name(.))"/>
6 9
7 <xsl:template match="*[count(*) = 0]"> 10 <xsl:template match="/">
8 <xsl:apply-templates mode="json-value" /> 11 <xsl:variable name="doc">
9 </xsl:template> 12 <xsl:apply-templates/>
10 13 </xsl:variable>
11 <xsl:template match="*[count(*) > 0]"> 14 <xsl:apply-templates select="exsl:node-set($doc)" mode="json-value" />
12 <xsl:text>{ </xsl:text>
13 <xsl:apply-templates mode="json-object-member"/>
14 <xsl:text> }</xsl:text>
15 </xsl:template> 15 </xsl:template>
16 16
17 <xsl:template match="text()"/> 17 <xsl:template match="*">
18 18 <xsl:copy>
19 <xsl:apply-templates select="@*"/>
20 <xsl:apply-templates/>
21 </xsl:copy>
22 </xsl:template>
23
24 <xsl:template match="@*">
25 <xsl:copy/>
26 </xsl:template>
27
19 <!-- handle json-object --> 28 <!-- handle json-object -->
20 29
21 <xsl:template name="write-object"> 30 <xsl:template match="*" mode="json-object-members">
31 <xsl:apply-templates select="." mode="json-object-members-internal"/>
32 </xsl:template>
22 33
34 <xsl:template match="*" mode="json-object-members-internal">
35 <xsl:variable name="oid" select="generate-id(.)"/>
36 <xsl:variable name="grouped" select="*[generate-id(.) = generate-id(key('members',concat($oid,local-name(.))))]"/>
37 <xsl:apply-templates select="$grouped" mode="json-object-member"/>
23 </xsl:template> 38 </xsl:template>
24 39
25 <xsl:template match="*" mode="json-object-member"> 40 <xsl:template match="*" mode="json-object-member">
26 <xsl:call-template name="write-json-string"> 41 <xsl:call-template name="write-string">
27 <xsl:with-param name="text" select="local-name(.)"/> 42 <xsl:with-param name="text" select="local-name(.)"/>
28 </xsl:call-template> 43 </xsl:call-template>
29 <xsl:text> : </xsl:text> 44 <xsl:text> : </xsl:text>
30 <xsl:apply-templates mode="json-value"/> 45 <xsl:apply-templates select="." mode="json-member-value"/>
46 <xsl:if test="position() != last()">
47 <xsl:text>, </xsl:text>
48 </xsl:if>
49 </xsl:template>
50
51 <xsl:template match="*" mode="json-member-value">
52 <xsl:variable name="oid" select="generate-id(..)"/>
53 <xsl:variable name="values" select="key('members',concat($oid,local-name(.)))"/>
54 <xsl:choose>
55 <xsl:when test="count($values) > 1">
56 <xsl:call-template name="write-array">
57 <xsl:with-param name="values" select="$values"/>
58 </xsl:call-template>
59 </xsl:when>
60 <xsl:otherwise>
61 <xsl:apply-templates select="$values" mode="json-value"/>
62 </xsl:otherwise>
63 </xsl:choose>
64 </xsl:template>
65
66 <xsl:template match="*" mode="json-array-item">
67 <xsl:apply-templates select="." mode="json-value"/>
31 <xsl:if test="position() != last()"> 68 <xsl:if test="position() != last()">
32 <xsl:text>, </xsl:text> 69 <xsl:text>, </xsl:text>
33 </xsl:if> 70 </xsl:if>
34 </xsl:template> 71 </xsl:template>
35 72
36 <!-- handle json-value --> 73 <!-- handle json-value -->
37
38 <xsl:template match="*[@xsi:nil = 'true']">
39 <xsl:text>null</xsl:text>
40 </xsl:template>
41 74
42 <xsl:template match="text()[. = 'true']" mode="json-value"> 75 <xsl:template match="text()[. = 'true']" mode="json-value">
43 <xsl:text>true</xsl:text> 76 <xsl:text>true</xsl:text>
44 </xsl:template> 77 </xsl:template>
45 78
52 mode="json-value"> 85 mode="json-value">
53 <xsl:value-of select="number(.)" /> 86 <xsl:value-of select="number(.)" />
54 </xsl:template> 87 </xsl:template>
55 88
56 <xsl:template match="text()" mode="json-value"> 89 <xsl:template match="text()" mode="json-value">
57 <xsl:call-template name="write-json-string"> 90 <xsl:call-template name="write-string">
58 <xsl:with-param name="text" select="."/> 91 <xsl:with-param name="text" select="."/>
59 </xsl:call-template> 92 </xsl:call-template>
60 </xsl:template> 93 </xsl:template>
61 94
62 <xsl:template match="*" mode="json-value"> 95 <xsl:template match="*[boolean(* | @*) or not(text())]" mode="json-value">
63 <xsl:apply-templates select="."/> 96 <xsl:call-template name="write-object"/>
97 </xsl:template>
98
99 <xsl:template match="*[@xsi:nil = 'true']" mode="json-value">
100 <xsl:text>null</xsl:text>
64 </xsl:template> 101 </xsl:template>
65 102
66 <!-- template traits --> 103 <!-- template traits -->
67 <xsl:template name="write-json-string"> 104
105 <xsl:template name="write-value">
106 <xsl:param name="value" select="."/>
107 <xsl:apply-templates select="exsl:node-set($value)" mode="json-value"/>
108 </xsl:template>
109
110 <xsl:template name="write-named-value">
111 <xsl:param name="name"/>
112 <xsl:param name="value"/>
113 <xsl:call-template name="write-string">
114 <xsl:with-param name="text" select="$name"/>
115 </xsl:call-template>
116 <xsl:text> : </xsl:text>
117 <xsl:apply-templates select="exsl:node-set($value)"/>
118 </xsl:template>
119
120 <!-- specialized template traits -->
121
122 <xsl:template name="write-string">
68 <xsl:param name="text"/> 123 <xsl:param name="text"/>
69 <xsl:value-of select="concat('&quot;', $text,'&quot;')" /> 124 <xsl:value-of select="concat('&quot;', $text,'&quot;')" />
70 </xsl:template> 125 </xsl:template>
126
127 <xsl:template name="write-object">
128 <xsl:param name="value" select="."/>
129 <xsl:text>{ </xsl:text>
130 <xsl:apply-templates select="$value" mode="json-object-members"/>
131 <xsl:text> }</xsl:text>
132 </xsl:template>
133
134 <xsl:template name="write-array">
135 <xsl:param name="oid" select="generate-id(..)"/>
136 <xsl:param name="values" select="key('members',concat($oid,local-name(.)))"/>
137
138 <xsl:text>[ </xsl:text>
139 <xsl:apply-templates select="$values" mode="json-array-item"/>
140 <xsl:text> ]</xsl:text>
141 </xsl:template>
142
143 <xsl:template name="write-object-members">
144 <xsl:param name="object" select="."/>
145 <xsl:for-each select="exsl:node-set($object)">
146 <xsl:apply-templates select="." mode="json-object-members-internal"/>
147 </xsl:for-each>
148 </xsl:template>
71 149
72 </xsl:stylesheet> 150 </xsl:stylesheet>