Gern stehe ich zur fachlichen Unterstützung in XML-Technologien, C#.NET, VisualBasic.NET und Java zur Verfügung. Sprechen Sie mich einfach an: Mail oder ☎ 0151 . 750 360 61


XPath 3.0, XPath 2.0, XPath 1.0 / XPath-Funktionen / XPath: Sequenz-Funktionen / XPath: fn:json-doc

XPath: fn:json-doc

XPath: fn:json-doc

fn:json-doc liest eine externe Datei aus und gibt das Ergebnis als JSON zurück.

Nehmen Sie die Datei ../input/json2.txt mit diesem Inhalt:


{"id":"1","name":"Holzflos","vorname":"Hugo"}

Die Auswertung mit fn:json-doc im Hinblick auf den Inhalt von name ...


 <xsl:template match="/">
  <Nachname>
   <xsl:value-of 
      select="fn:json-doc('../input/json2.txt')?name"/>
  </Nachname>
 </xsl:template>

... ergibt:


<Nachname>Holzflos</Nachname>

Wenn die Datei ../input/json2.txt ein ganzes Array darstellt, wie in diesem Ansatz:


[
 {"id":"1","name":"Holzflos","vorname":"Hugo"},
 {"id":"2","name":"Türschlos","vorname":"Theo"}
]

... dann lässt sich das name-Property der jeweiligen JavaScript-Objekte so auswerten:


<xsl:template match="/">
  <Nachnamen>
   <xsl:for-each 
        select="fn:json-doc('../input/json2.txt')?*?name">
    <NN>
     <xsl:value-of select="."/>
    </NN>
   </xsl:for-each>
  </Nachnamen>
</xsl:template>

Das Ergebnis sieht dann so aus:


<Nachnamen>
  <NN>Holzflos</NN>
  <NN>Türschlos</NN>
</Nachnamen>

Wer alle Informationen auf einen Schlag haben möchte, der kann mit den beliebten Schleifen <xsl:for-each select=".?*"> arbeiten. Das einzelne Feld im JSON-Array kann als betrachtet werden, sodass hier auch mit der XPath-Funktion map:size gearbeitet werden kann.


<xsl:template match="/">
  <Info>
   <xsl:for-each 
        select="fn:json-doc('../input/json2.txt')?*">
    <JS-Objekt anzahlItems="{map:size(.)}">        
     <xsl:for-each select=".?*">
      <info>
       <xsl:value-of select="."/>
      </info>
     </xsl:for-each>
    </JS-Objekt>
   </xsl:for-each>
  </Info>
</xsl:template>

In diesem Fall erhalten Sie die Werte, aber noch ohne die Namen der Felder:


<Info>
  <JS-Objekt anzahlItems="3">
    <info>1</info>
    <info>Holzflos</info>
    <info>Hugo</info>
  </JS-Objekt>
  <JS-Objekt anzahlItems="3">
    <info>2</info>
    <info>Türschlos</info>
    <info>Theo</info>
  </JS-Objekt>
</Info>

Die Feldnamen brauchen Sie auch? Bitte sehr:


<xsl:template match="/">
  <Info>
   <xsl:for-each 
        select="fn:json-doc('../input/json2.txt')?*">
    <JS-Objekt>
     <xsl:for-each 
          select="map:for-each(., 
                  function ($k, $v){ 
                      fn:concat($k, '|', $v)
                      }
                  )">
      <info name="{substring-before(xs:string(.), '|')}">
       <xsl:value-of select="substring-after(., '|')"/>
      </info>
     </xsl:for-each>
    </JS-Objekt>
   </xsl:for-each>
  </Info>
</xsl:template>

Und so sieht's aus. Zufrieden?


<Info>
  <JS-Objekt>
    <info name="id">1</info>
    <info name="name">Holzflos</info>
    <info name="vorname">Hugo</info>
  </JS-Objekt>
  <JS-Objekt>
    <info name="id">2</info>
    <info name="name">Türschlos</info>
    <info name="vorname">Theo</info>
  </JS-Objekt>
</Info>

wg / 4. April 2018



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/jsondoc.html