Home
Über mich
Blog
Veröffentlichungen
IT-Trainings
Impressum


XPath: fn:json-doc

Zusammenfassung:

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

XPath: fn:json-doc

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

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

Die Auswertung mit fn:json-doc ...

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

... ergibt:

<Nachname>Holzflos</Nachname>

Ja, und 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äßt sich das "name"-Property der jeweiligen Javascript-Objekte so auswerten:

  <xsl:template match="/" name="xsl:initial-template">
    <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 map betrachtet werden, so daß hier auch mit der XPath-Funktion map:size gearbeitet werden kann.

  <xsl:template match="/" name="xsl:initial-template">
    <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 wir 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 wir auch? Bitte sehr:

  <xsl:template match="/" name="xsl:initial-template">
    <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>

qrpic/jsondoc.jpg

wg / 14. Oktober 2017




Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf (info10@wilfried-grupe.de).



Vielen Dank für Ihr Interesse an meiner Arbeit.


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

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