Dienstag, 3. August 2010

C# in XSL

Skurril aber funktioniert, C# Code in XSL ausführen.
Wir kann man in XSL C# Code unterbringen und damit bei der Transformation scripten? Das war meine Frage, als ich mal wieder so abends zu Hause saß. Der BizTalk kann das ja mit seinen Funktoiden auch.
Ich habe dazu einen Artikel vom MSDN Magazin http://msdn.microsoft.com/en-us/magazine/cc302079.aspx gefunden.
Hier nun mal ein kleines Beispiel, das Namen und Vornamen der Personen in einer Datei speichert.
Zuerst die XML Datei.
<?xml version="1.0" encoding="utf-8"?>
<Personen>
  <Person>
    <Name>Müller</Name>
    <Vorname>Hans</Vorname>
  </Person>
  <Person>
    <Name>Meier</Name>
    <Vorname>Horst</Vorname>
  </Person>
  <Person>
    <Name>Funke</Name>
    <Vorname>Chsristian</Vorname>
  </Person>
</Personen>

Dann das XSL:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:script="urn:my-scripts"
    exclude-result-prefixes="msxsl">

  <msxsl:script language="C#" implements-prefix="script">
    <msxsl:using namespace="System.IO" />
    <![CDATA[
    public void WriteToFile(string s){
        File.AppendAllText("c://temp/Personen.txt",s);
    }
    ]]>
  </msxsl:script>

  <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/Personen">
      <xsl:for-each select="Person">
        <xsl:sort select="Name"/>
        <xsl:call-template name="Person" />
      </xsl:for-each>
    </xsl:template>

  <xsl:template name="Person">
    <xsl:value-of select="script:WriteToFile(concat(Name, Vorname))"/>
  </xsl:template>
</xsl:stylesheet>

Hier noch der Link zur MSDN zum msxml:script Tag:
Nun haben wir diese Funktionalität auch schon bei uns verwendet. Und, voila, es funktioniert perfekt.
Der C# Code lässt sich auch in einer extra Datei unterbringen. Dann kann man die Scripte für mehrere XSLs sharen.
Dazu kommt später noch ein Beispiel.
Wir haben übrigens eine Liste mit Artikeln und Lagercodes als XML gehabt. Diese Liste haben wir transformiert und für jeden Lagercode eine extra CSV Datei erstellt.
Es kam hier nicht auf Geschwindigkeit an.
Viel Spaß.

Keine Kommentare:

Kommentar posten