V tomto článku se podíváme na zoubek zajímavému způsobu, jak vykonat kód v jazycích C# nebo VB.NET v XSLT šabloně. Tuto techniku hodně programátorů opomíjí, což je podle mého názoru velká škoda, protože zvládnutí tohoto způsobu transformací otevírá novou cestu po stezce XSL transformací.

Třída XslTransform umožňuje vložit kód v jazyce C#, VB.NET nebo JScript do samotné šablony stylů. Ve chvíli, kdy je šablona načtena, všechny funkce jsou zkompilovány obdobným způsobem jako kód na stránce ASP.NET do jazyka Microsoft Intermediate Language (MSIL). To řečeno „lidsky“ znamená, že uložení funkcí přímo do šablony nemá žádný negativní dopad na výkon aplikace!

Kód se nachází uvnitř elementu <msxsl:script>, který má dva atributy – „language“ a „implements-prefix“. Uvnitř atributu „language“ se může vyskytnout jeden z následujících řetězců: C#, VB, JScript, JavaScript, VisualBasic nebo CSharp. Pokud ponecháme atribut „language“ prázdný, bude se předpokládat použití jazyka JScript. Atribut „implements-prefix“ stanovuje jmenný prostor spojený s naším blokem kódu. Tento prefix musíme však také definovat v šabloně stejně, jako každý jiný jmenný prostor.

Z teoretického pohledu toto, myslím, plně dostačuje, podívejme se na jednoduchý příklad. Nejdříve musíme mít nějaká XML data:

<?xml version=“1.0″ ?>
<UserList>
 <User ID=“00001″>
  <Nick>dmx</Nick>
  <DateOfBirth>9.4.1984</DateOfBirth>
 </User>
 <User ID=“00002″>
  <Nick>billG</Nick>
  <DateOfBirth>20.10.1980</DateOfBirth>
 </User>
</UserList>

Poté vytvoříme šablonu stylů, do které vložíme nějaký kód:

<xsl:stylesheet version=“1.0″ xmlns:xsl=“http://www.w3.org/1999/XSL/Transform“
   xmlns:msxsl=“urn:schemas-microsoft-com:xslt“
   xmlns:dmx=“urn:my-scripts“>
 <msxsl:script language=“C#“ implements-prefix=“dmx“>
  <![CDATA[
   public int GetAge(string date)
   {
    int age = 0;
    System.DateTime dateOfBirth = System.DateTime.Parse(date);
    System.TimeSpan ts = System.DateTime.Now – dateOfBirth;
    age = (int)(ts.TotalDays / 365.25);
    return age;
   }
  ]]>
 </msxsl:script>
 <xsl:template match=“/“>
  <p>
   <xsl:for-each select=“UserList/User“>
   <xsl:value-of select=“@ID“ /> == <xsl:value-of select=“Nick“ />:
   <xsl:value-of select=“dmx:GetAge(DateOfBirth)“/> let
   <br />
  </xsl:for-each>
  </p>
 </xsl:template>
</xsl:stylesheet>

Na začátku definujeme použité jmenné prostory. Nejprve „msxsl“ (použitý u prvku script) a potom prefix použitý pro kód. Následuje náš blok kódu. Specifikovali jsme oba dva parametry, jako jazyk budeme používat C#. Doporučuje se, aby samotný kód byl vložen do sekce CDATA. Pokud tak neučiníte, vystavujete se nebezpečí nečekaných pádů a výjimek.

V ukázce definujeme pouze jednu funkci GetAge(string). Ta nedělá nic jiného, než že převádí řetězcovou reprezentaci data na System.DateTime a následně vypočítá, kolik let uběhlo od daného okamžiku (v tomto případě narození jisté osoby).

Za kódem následuje samotná šablona, ve které nás bude zajímat snad jen řádek <xsl:value-of select="dmx:GetAge(DateOfBirth)"/>. Tady právě voláme metodu GetAge a jako parametr jí předáváme hodnotu uzlu DateOfBirth. Všimněte si prefixu „dmx“ před GetAge. Zbytek šablony ponechám bez výkladu, není tam nic zajímavého.

Aby to všechno mělo nějaký efekt, musíme vytvořit nějaký ASP.NET formulář. Mohl by to vypadat třeba takhle:

<%
 XPathDocument dokument = new XPathDocument(Server.MapPath(„Users.xml“));
 XslTransform xsl = new XslTransform();
 xsl.Load(Server.MapPath(„Users.xslt“));
 xsl.Transform(dokument, null, Response.OutputStream);
%>

Výsledkem nám bude jakýsi seznam přezdívek a jejich aktuálního věku. Možností, jak využít tuto techniku je opravdu hodně, záleží hlavně na vaší fantazii. Začít můžete třeba úpravami výše uvedeného příkladu, který je vám k dispozici v ZIP archivu.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět