XPath 3.0, XPath 2.0, XPath 1.0 / XPath Funktionen / XPath: transform

XPath: transform

XPath: transform

Die XPath-Funktion "transform" startet eine XSL-Transformation mit einem dynamisch geladenen XSL-Stylesheet.

XPath: transform

Die XPath-Funktion "transform" erlaubt, zur Ausführung der weiteren Programmlogik externe XSL-Stylesheets dynamisch zu laden, dort eine Konvertierung durchzuführen und dessen Ergebnis weiter zu verwenden.

Nehmen wir an, das dynamisch zu ladende XSL-Stylesheet trägt den vielsagenden Namen "test.xsl", und sie hat den folgenden Aufbau:


  <xsl:template match="/">    
        <ergebnis>
          <xsl:for-each select="//Mensch">
            <Person>
              <VN><xsl:value-of select="vorname"/></VN>
              <NN><xsl:value-of select="name"/></NN>
              <WO><xsl:value-of select="../name"/></WO>
            </Person>
          </xsl:for-each>
        </ergebnis>
  </xsl:template>

Eine entsprechende XML Input-Struktur vorausgesetzt, sieht das (gekürzt dargestellte) Ergebnis dieser dynamisch aufgerufenen Transformation so aus:


<ergebnis>
  <Person>
   <VN>Hugo</VN>
   <NN>Holzflos</NN>
   <WO>Neustadt</WO>
  </Person>
  <Person>
   <VN>Nicole</VN>
   <NN>Nixlos</NN>
   <WO>Neustadt</WO>
  </Person>
...
</ergebnis>

Das "test.xsl" - XSL-Stylesheet wird via der transform - Funktion durch die Hauptanwendung aufgerufen, dabei ist auch die Quelle ("source-node") zu benennen. Der temporäre Daten-Input ist (wie besprochen) das vorstehende XML Dokument.


<xsl:stylesheet 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:map="http://www.w3.org/2005/xpath-functions/map"
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  exclude-result-prefixes="xs map" 
  version="3.0">
  <xsl:output method="xml" indent="yes"/>
  <xsl:template match="/">    
      <xsl:variable name="v"
        select="
          transform(map {
            'stylesheet-location': 'test.xsl',
            'source-node': doc('../input/Ort_Elemente.xml')
          })"/>
      <ergebnis>
        <xsl:for-each select="map:get($v, 'output')//Person">
          <ppp nachname="{NN}">
            <xsl:value-of select="VN"/>
          </ppp>
        </xsl:for-each>        
      </ergebnis>
  </xsl:template>
</xsl:stylesheet>

Die transform-Funktion verarbeitet den dynamisch generierten Inhalt als eine einzelne map, deren Inhalt in einem XML-Baum besteht, der über //Person aabgearbeitet werden kann.


<ergebnis>
  <ppp nachname="Holzflos">Hugo</ppp>
  <ppp nachname="Nixlos">Nicole</ppp>
  <ppp nachname="Sprachlos">Stefan</ppp>
  <ppp nachname="Sagblos">Stefan</ppp>
  <ppp nachname="Sorglos">Siggi</ppp>
  <ppp nachname="Herzlos">Heini</ppp>
  <ppp nachname="Rhodos">Rudi</ppp>
  <ppp nachname="Kolos">Karl</ppp>
  <ppp nachname="Sinnlos">Simone</ppp>
  <ppp nachname="Hirnlos">Horst</ppp>
  <ppp nachname="Wertlos">Werner</ppp>
  <ppp nachname="Lustlos">Ludwig</ppp>
  <ppp nachname="Wasistlos">Willi</ppp>
  <ppp nachname="Ruhelos">Rita</ppp>
  <ppp nachname="Schlaflos">Susi</ppp>
  <ppp nachname="Rielos">Lotte</ppp>
  <ppp nachname="Bodenlos">Betty</ppp>
  <ppp nachname="Muehelos">Martin</ppp>
  <ppp nachname="Leinenlos">Liane</ppp>
</ergebnis>

Der Aufruf kann analog auch in XQuery durchgeführt werden (jawohl, XQuery ruft hier XSLT auf):


declare namespace map = "http://www.w3.org/2005/xpath-functions/map";
<erg>
  {
    let $v := transform(map {
            'stylesheet-location': '../xsl/test.xsl',
            'source-node': doc('../input/Ort_Elemente.xml')
          })    
    for $x at $p in map:get($v, 'output')//Person
       return
    <xqperson nr="{$p}">
      <VN>{$x/VN/text()}</VN>
      <NN>{$x/NN/text()}</NN>
    </xqperson>
  }
</erg>

Auch hier können wir uns über ein Ergebnis freuen:


<erg>
  <xqperson nr="1">
   <VN>Hugo</VN>
   <NN>Holzflos</NN>
  </xqperson>
  <xqperson nr="2">
   <VN>Nicole</VN>
   <NN>Nixlos</NN>
  </xqperson>
  <xqperson nr="3">
   <VN>Stefan</VN>
   <NN>Sprachlos</NN>
  </xqperson>
  <xqperson nr="4">
   <VN>Stefan</VN>
   <NN>Sagblos</NN>
  </xqperson>
  <xqperson nr="5">
   <VN>Siggi</VN>
   <NN>Sorglos</NN>
  </xqperson>
  <xqperson nr="6">
   <VN>Heini</VN>
   <NN>Herzlos</NN>
  </xqperson>
  <xqperson nr="7">
   <VN>Rudi</VN>
   <NN>Rhodos</NN>
  </xqperson>
  <xqperson nr="8">
   <VN>Karl</VN>
   <NN>Kolos</NN>
  </xqperson>
  <xqperson nr="9">
   <VN>Simone</VN>
   <NN>Sinnlos</NN>
  </xqperson>
  <xqperson nr="10">
   <VN>Horst</VN>
   <NN>Hirnlos</NN>
  </xqperson>
  <xqperson nr="11">
   <VN>Werner</VN>
   <NN>Wertlos</NN>
  </xqperson>
  <xqperson nr="12">
   <VN>Ludwig</VN>
   <NN>Lustlos</NN>
  </xqperson>
  <xqperson nr="13">
   <VN>Willi</VN>
   <NN>Wasistlos</NN>
  </xqperson>
  <xqperson nr="14">
   <VN>Rita</VN>
   <NN>Ruhelos</NN>
  </xqperson>
  <xqperson nr="15">
   <VN>Susi</VN>
   <NN>Schlaflos</NN>
  </xqperson>
  <xqperson nr="16">
   <VN>Lotte</VN>
   <NN>Rielos</NN>
  </xqperson>
  <xqperson nr="17">
   <VN>Betty</VN>
   <NN>Bodenlos</NN>
  </xqperson>
  <xqperson nr="18">
   <VN>Martin</VN>
   <NN>Muehelos</NN>
  </xqperson>
  <xqperson nr="19">
   <VN>Liane</VN>
   <NN>Leinenlos</NN>
  </xqperson>
</erg

wg / 29. Dezember 2017



Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf:

Vorname
Nachname
Mailadresse







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: info2018@wilfried-grupe.de

www.wilfried-grupe.de/XPATH_transform.html