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: transform

XPath: transform

XPath: transform

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

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

Nehmen Sie 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 beschrieben) 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 abgearbeitet 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 Sie sich ü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 / 5. 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/XPATH_transform.html