XPath 3.0, XPath 2.0, XPath 1.0 / 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.

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 leicht angepasst:


<xsl:copy-of select="json-to-xml('
   {
     &quot;a&quot;: 1, 
     &quot;b&quot;: [3,6,9], 
     &quot;LN&quot;: &quot;Rielos&quot;, 
     &quot;FN&quot;: &quot;Lotte&quot;, 
     &quot;IsFemale&quot;:true
   }
')"/>

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:


<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: , 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 / 4. April 2018



Fragen? Anmerkungen? Tips?

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