XPROC * XSL-FO * SVG * XML * XML-SCHEMA * XPATH * XSL * XSLT 1.0 * XSLT 2.0 * XSLT 3.0 * XQUERY * ANT



XPath / XPath-Funktionen / XPath: Sequenz-Funktionen / XPath: json-to-xml, xml-to-json

XPath: json-to-xml, xml-to-json

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.

Auf dieser Seite:

Nehmen Sie als Beispiel den folgenden -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 in eine Variable gepackt:


<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     version="3.0">
    <xsl:output method="xml" indent="yes"/>    
    <xsl:template match="/">
        <xsl:variable name="vjson">{
            "a": 1, 
            "b": [3,6,9], 
            "LN": "Rielos", 
            "FN": "Lotte", 
            "IsFemale":true
            }</xsl:variable>        
        <xsl:copy-of select="json-to-xml($vjson)"/>        
    </xsl:template>
</xsl:stylesheet>

Die json-to-xml-Funktion erkennt die JavaScript-Datentypen automatisch und erzeugt entsprechende Start-und Ende-Tags im Namespace http://www.w3.org/2013/XSL/json. Die Namen der Datenfelder finden sich durchweg im Attribut key wieder. Das Ergebnis dürfte überzeugen:


<map xmlns="http://www.w3.org/2005/xpath-functions">
   <number key="a">1</number>
   <array key="b">
      <number>3</number>
      <number>6</number>
      <number>9</number>
   </array>
   <string key="LN">Rielos</string>
   <string key="FN">Lotte</string>
   <boolean key="IsFemale">true</boolean>
</map>

Noch einfacher ist der Aufruf für ein separates JSON-Dokument, in diesem Fall "json1.txt" (wichtig: , nicht , 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, dass die id in JSON als String definiert wurde ("id":"1"), wurde sie auch im XML-Ergebnis als j:string ausgegeben.

Auf diese Weise wurde mit 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>

xml-to-json

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 / 26. Januar 2020



Fragen? Anmerkungen? Tipps?

Bitte nehmen Sie Kontakt zu mir auf.






Vielen Dank für Ihr Interesse an meiner Arbeit.



V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de

www.wilfried-grupe.de/json_to_x_m_l.html