XPath 3.0, XPath 2.0, XPath 1.0 / XPath Funktionen / XPath: Sequence-Funktionen / XPath json-to-xml, xml-to-json
➪ json-to-xml konvertiert JSON in eine XML-Struktur, die im Namespace http://www.w3.org/2013/XSL/json definiert ist. xml-to-json konvertiert ein XML-Dokument mit analoger Datenstruktur in einen JSON-String.
Nehmen wir als Beispiel den folgenden JSON-String, der wesentliche Javascript-Typdefinitionen (Zahl, Array, String, Boolean) bereits vorwegnimmt.
{
"a": 1,
"b": [3,6,9],
"LN": "Rielos",
"FN": "Lotte",
"IsFemale":true
}
Für den direkten Aufruf in XSLT 3.0 und der "json-to-xml"-Funktion habe ich den JSON-String leicht angepaßt:
<xsl:copy-of select="json-to-xml('
{
"a": 1,
"b": [3,6,9],
"LN": "Rielos",
"FN": "Lotte",
"IsFemale":true
}
')"/>
Die "json-to-xml"-Funktion erkennt die Javascript-Datentypen automatisch und erzeugt entsprechende Start-und Endetags im Namespace "http://www.w3.org/2013/XSL/json". Die Namen der Datenfelder finden wir durchweg im Attribut "key" wieder. Das Ergebnis dürfte überzeugen:
<j:map xmlns:j="http://www.w3.org/2013/XSL/json">
<j:number key="a">1</j:number>
<j:array key="b">
<j:number key="3">3</j:number>
<j:number key="3">6</j:number>
<j:number key="3">9</j:number>
</j:array>
<j:string key="LN">Rielos</j:string>
<j:string key="FN">Lotte</j:string>
<j:boolean key="IsFemale">true</j:boolean>
</j:map>
Noch einfacher ist der Aufruf für ein separates JSON-Dokument, in diesem Fall "json1.txt" (wichtig: xsl:copy-of, nicht xsl:value-of, da sonst lediglich die Textinhalte wiedergegeben werden). Wenn "json1.txt" den folgenden Inhalt hat:
[{"id":"1","name":"Holzflos","vorname":"Hugo"},
{"id":"2","name":"Sagblos","vorname":"Stefan"},
{"id":"8","name":"Rhodos","vorname":"Rudi"},
{"id":"15","name":"Kolos","vorname":"Karl"},
{"id":"19","name":"Lustlos","vorname":"Ludwig"},
{"id":"10","name":"Ruhelos","vorname":"Rita"},
{"id":"11","name":"Schlaflos","vorname":"Susi"},
{"id":"12","name":"Rielos","vorname":"Lotte"},
{"id":"13","name":"Muehelos","vorname":"Martin"},
{"id":"14","name":"Leinenlos","vorname":"Liane"}]
... dann ergibt der Aufruf von ...
<xsl:copy-of select="json-to-xml(unparsed-text('json1.txt'))"/>
... dieses (gekürzte) Ergebnis:
<j:array xmlns:j="http://www.w3.org/2013/XSL/json">
<j:map>
<j:string key="id">1</j:string>
<j:string key="name">Holzflos</j:string>
<j:string key="vorname">Hugo</j:string>
</j:map>
<!-- alle weiteren Ergebnisse bis: -->
<j:map>
<j:string key="id">14</j:string>
<j:string key="name">Leinenlos</j:string>
<j:string key="vorname">Liane</j:string>
</j:map>
</j:array>
Dadurch, daß die "id" in JSON als String definiert wurde ("id":"1"), wurde sie auch im XML-Ergebnis als j:string ausgegeben.
Auf diese Weise wurde aus mit Hilfe der json-to-xml-Funktion aus dem JSON-String ein XML-Dokument dieser Struktur generiert:
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
targetNamespace="http://www.w3.org/2013/XSL/json"
xmlns:j="http://www.w3.org/2013/XSL/json">
<xs:element name="array">
<xs:complexType>
<xs:sequence>
<xs:element
maxOccurs="unbounded"
ref="j:map"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="map">
<xs:complexType>
<xs:sequence>
<xs:element
maxOccurs="unbounded"
ref="j:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="string">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:NMTOKEN">
<xs:attribute
name="key"
use="required"
type="xs:NCName"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:schema>
Umgekehrt generiert xml-to-json aus einem XML-Dokument dieser Struktur wieder einen JSON-String.
<xsl:variable name="vjson">
<xsl:copy-of
select="json-to-xml(unparsed-text('json1.txt'))"/>
</xsl:variable>
<xsl:copy-of select="xml-to-json($vjson)"/>
wg / 8. Februar 2018
Fragen? Anmerkungen? Tips?
Bitte nehmen Sie Kontakt zu mir auf:
V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn
☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de