reklama

Poznáváme C# a Microsoft.NET 47. díl – použití XSL transformací

Tento díl, který je pravděpodobně posledním dílem, ve kterém se budeme zabývat použitím technologií, které souvisí se zpracováním XML v .NET frameworku, bude pojednávat o aplikaci výkonné transformační technologie XSLT.

XSL transformace? O co jde?

Nejprve se velmi krátce zmíním o tom, jakou technologii to vlastně v tomto díle budeme aplikovat. V případě, že se budete chtít o této zajímavé technologii dozvědět něco více nebo se ji naučit , pokud ji ještě neovldádáte, tak na českém webu jistě naleznete spoustu kvalitních informaci o ní.Technologie XSLT neboli XSL Transformations je standardem světoznámého konsorcia W3C a je částí jazyka XSL (eXtensible Stylesheet language), což je původem stylovací jazyk založený na XML.

Pomocí XSLT jsme schopni uskutečnit transformaci XML dokumentu na jiný XML dokument, nebo i dokument zcela jiného formátu (velmi často to bývá HTML). Jsme také schopni vynechat některé elementy nebo jejich atributy, ale naopak jsme shopni jak elementy tak ostatní uzly do výsledného proudu proudícího z XSLT procesoru přidat. Při definici XSLT šablon se pro výběr částí dokumentu ke zpracování využívá jazyku XPath.

Pro naše ukázkové příklady v tomto díle bude, stejně jako v těch předchozích, použit XML dokument s údaji o zaměstnanci.

<?xml version="1.0" encoding="utf-8" ?>
<zamestnanci>
  <zamestnanec jmeno="Michal" prijmeni="Racek" pozice="Vyvojar"/>
  <zamestnanec jmeno="Jan" prijmeni="Novak" pozice="Analytik"/>
  <zamestnanec jmeno="Jiri" prijmeni="Joudek" pozice="Vyvojar"/>
</zamestnanci>

Pro tento XML dokument jsem vytvořil jednoduchou ukázkovou šablonu pro XSLT, která vypadá následovně :

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="
http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" />
  <!-- korenovy uzel -->
  <xsl:template match="/">
    <xsl:element name="HTML">
      <xsl:element name="BODY">
        <xsl:element name="HEAD">
          <xsl:element name="TITLE">
            XSLT V .NET - PRIKLADY ZIVE
          </xsl:element>
        </xsl:element>
        <!-- aplikace sablon na vnitrek uzlu -->
        <xsl:apply-templates/>
      </xsl:element>
    </xsl:element>
  </xsl:template>
  <!-- element zamestnanci -->
  <xsl:template match="zamestnanci">
    <xsl:element name="H1">
      Seznam zamestnancu :
    </xsl:element>
    <xsl:element name="UL">
      <xsl:apply-templates/>
    </xsl:element>
  </xsl:template>
  <!-- element zamestnanec -->
  <xsl:template match="zamestnanec">
    <xsl:element name="LI">
      <!-- vypsani hodnot atributu elementu -->
      <xsl:value-of select="@prijmeni"/>
      <!-- vypsani entity &nbsp_u32 ?-->
      <xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
      <xsl:value-of select="@jmeno"/>
      - <xsl:value-of select="@pozice"/>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

Pro ty co XSLT dnes vidí poprvé se alespoň pokusím vysvětlit co má daná šablona se vstupním XML dokumentem provádět. Uvedená šablona má za úkol převést naše data o zaměstancích do HTML stránky zobrazitelné v browseru. XSLT šablony jsou zpracovávány od shora dolů, takže při výskytu kořenového uzlu XML dokumentu se zajistí zapsání úvodních HTML tagů (HTML, HEAD...) do výsledného datového proudu.

Pokud se narazí na element s názvem zamestnanci je vygenerován nadpis H1 po té ještě element UL. Pomocí elementu <xsl:apply-templates> zajistíme použití šablon na vnitřek elementu zamestnanci. A to zajistí, že pro každý element zamestanec je vygenerován element LI.

Použití XSLT v .NET frameworku

Stěžejní třídou pro provádění XSL transformací je v základní knihovně tříd .NET frameworku třída XslTransform, kterou nalezneme ve jmenném prostoru System.Xml.Xsl. Zdroje pro transformaci jsou představovány instancemi tříd XMLDocument, XMLDataDocument nebo XPathDocument, které všechny implementují rozhraní IXPathNavigable. Jako nejvhodnější pro klasické transformace se jeví použití instancí třídy XPathDocument, které by mělo zajišťovat nejvyšší výkon. Následující příklad již obsahuje C# kód, který transformaci pomocí zmíněné třídy XSLTransform provádí.

/// <summary>
/// Ukazka jednoduche transformace, kde je zdroj XPathDocument
/// </summary>
public static void DoTransform()
{
 
  //definice cest
  string lDocPath = AppDomain.CurrentDomain.BaseDirectory + "zamestnanci.xml";
  string lStyleSheetPath = AppDomain.CurrentDomain.BaseDirectory + "ZamestnanciToHtml.xslt";
  string lOutputPath = AppDomain.CurrentDomain.BaseDirectory + "zamestanci.html";
  //nahrani dokumentu
  XPathDocument lDoc = new XPathDocument(lDocPath);
  XslTransform lTransform = new XslTransform();
  StreamWriter lWriter = new StreamWriter(lOutputPath);
  try
  {
    //nahrani sablony
    lTransform.Load(lStyleSheetPath);
    //provedeni transformace
    lTransform.Transform(lDoc, null, lWriter, null);
    Console.WriteLine("Transformace byla dokoncena");
  }
  catch(Exception ex)
  {
    Console.WriteLine("Nastala vyjimka {0} ", ex.ToString());
  }
}

Jak vidíte, tak provedení transformace není v .NET vůbec složité. Po vytvoření instance třídy XPathDocument na základě našeho cvičného XML dokumentu stačí vytvořit instanci třídy XslTransform pomocí její instanční metody Load nahrát požadovanou šablonu. A k provedení samostatné transformace použijeme jednu z mnoha přetížených verzí metody Transform, které v našem případě předáme pouze zdroj ve formě instance třídy XPathDocument a výstupní proud zaobalený do instance třídy StreamWriter.

Po úspěšném provedení transformace byste měli dostat takovýto výsledný HTML dokument:

<HTML>
  <BODY>
    <HEAD>
      <META http-equiv="Content-Type" content="text/html; charset=utf-8">
      <TITLE>
  XSLT V .NET - PRIKLADY ZIVE
  </TITLE>
    </HEAD>
    <H1>
      Seznam zamestnancu :
  </H1>
    <UL>
      <LI>Racek&nbsp;Michal   - Vyvojar</LI>
      <LI>Novak&nbsp;Jan - Analytik</LI>
      <LI>Joudek&nbsp;Jiri - Vyvojar</LI>
    </UL>
  </BODY>
</HTML>

Předávání parametrů transformačnímu jádru

Možnosti transformačního jádra .NET frameworku jdou ještě dál. Kromě takovýchto jednoduchých transformací je možné provádět i transformace při nichž jsou používány uživatelské parametry, které definujeme v našem kódu. K dosažení tohoto, jistě v mnohým situacích užitečného, výsledku je potřeba použít třídu XsltArgumentList, která slouží k uchovávání uživatelských parametrů a jejich následné předání transformačnímu jádru .NET. Pro ukázku funkčnosti této vlastnosti jsem vytvořil následující demostranční XSLT šablonu:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="
http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" />
  <xsl:param name="sorting"/>
  <!--koren uzlu -->
  <xsl:template match="/">
    <xsl:element name="HTML">
      <xsl:element name="HEAD">
        <xsl:element name="TITLE">
          XSLT V .NET - PRIKLADY ZIVE
        </xsl:element>
      </xsl:element>
      <xsl:element name="BODY">
        <xsl:element name="H1">
          Serazeny seznam zamestnancu :
        </xsl:element>
        <xsl:element name="UL">
          <!-- pruchod vsemi uzly zamestnanec obsazenymi uzlu zamestnanci -->
          <xsl:for-each select="zamestnanci/zamestnanec">
            <!-- jako parametr pro razeni bude pouzit vnejsi parametr -->
            <xsl:sort select="@*[local-name() = $sorting]"/>
            <xsl:element name="LI">
              <xsl:value-of select="@prijmeni"/>
              <!-- vypsani entity &nbsp_u32 ?-->
              <xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
              <xsl:value-of select="@jmeno"/>
                - <xsl:value-of select="@pozice"/>
            </xsl:element>
          </xsl:for-each>
        </xsl:element>
      </xsl:element>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

Uživatelský parametr je v šabloně definován ve vrchní části pomocí elementu <xsl:param> a jeho hodnota je použita v XPath výrazu pro určení parametru pro řazeni (<xsl:sort select="@*[local-name() = $sorting]"/>). Jak jsem již napsal, tak k předání parametrů slouží třída XslArgumentList a kód, který ji využívá následuje.

/// <summary>
/// Ukazka jednoduche transformace pri ktere jsou transformacnimu
/// jadru predany parametry
/// </summary>
public static void DoTransformWithArgs()
{
  string lDocPath = AppDomain.CurrentDomain.BaseDirectory + "zamestnanci.xml";
  string lStyleSheetPath = AppDomain.CurrentDomain.BaseDirectory + "ZamestnanciToHtmlWithSorting.xslt";
  string lOutputPath = AppDomain.CurrentDomain.BaseDirectory + "zamestanci.html";
  XPathDocument lDoc = new XPathDocument(lDocPath);
  XslTransform lTransform = new XslTransform();
  StreamWriter lWriter = new StreamWriter(lOutputPath);
  //vytvoreni argumentu pro transformacni jadro
  XsltArgumentList lArgs = new XsltArgumentList();
lArgs.AddParam("sorting","","prijmeni");
  try
  {
    lTransform.Load(lStyleSheetPath);
//predni argumentu metode
    lTransform.Transform(lDoc ,lArgs ,lWriter, null);
    Console.WriteLine("Transformace byla dokoncena");
  }
  catch(Exception ex)
  {
    Console.WriteLine("Nastala vyjimka {0} ", ex.ToString());
  }
}

Kód se od přechozího v podstatě změnil pouze o použití zminěné třídy XslArgumentList, do jejíž instance jsou pomoci metody AddParam vloženy parametry pro transformační jádro. Instance této třídy je následně předána metodě Transform třídy XslTransform. Výsledné HTML by mělo být stejně jako v předchozím případě, s tím rozdílem, že záznamy budou seřazeny (v našem příkladu podle příjmení).

Zdrojové kódy k příkladům naleznete zde.

Témata článku: Software, Microsoft, Programování, Element, Select, Match, Head, Catch

6 komentářů

Nejnovější komentáře

  • Pavel Polívka 24. 11. 2007 13:42:41
    Programovou oflline verzi seriálu naleznete ke stažení na...
  • Šerlok Homeless 15. 8. 2007 13:42:33
    http://www.editix.com/download.html Ale nevím, jestli je free a jestli...
  • SlavekB 8. 11. 2005 10:12:20
    Víte někdo o nějakém free visualnim editoru šablon?
reklama
Určitě si přečtěte

UPC překopli páteřní kabel. V Brně i druhý den nejede internet ani kabelovka

UPC překopli páteřní kabel. V Brně i druhý den nejede internet ani kabelovka

** V Brně byl velký výpadek služeb UPC ** Důvodem je překopnutý páteřní kabel ** V některých lokalitách služby stále nefungují

5.  12.  2016 | Jakub Čížek | 104

17 expertek Microsoftu předpovědělo rok 2027. Splní se alespoň něco?

17 expertek Microsoftu předpovědělo rok 2027. Splní se alespoň něco?

** Zmizí klasické vyhledávače ** Budeme programovat buňky ** Kvantové počítače překonají šifry

6.  12.  2016 | Jakub Čížek | 36

11 tipů na dobrý stolní počítač: od základu po herní mašiny

11 tipů na dobrý stolní počítač: od základu po herní mašiny

** Postavte si stolní počítač! Máme pro vás 11 vzorových sestav s rozpisem komponent ** Většina tipů cílí na hráče, věnujeme se ale i základnímu PC a počítačům na střih videa ** Nadělte si nový počítač třeba pod stromeček

5.  12.  2016 | Adam Kahánek | 74

Nejlepší notebooky nad 20 tisíc: poradíme, které teď chcete

Nejlepší notebooky nad 20 tisíc: poradíme, které teď chcete

** V notebooku s cenou nad 20 tisíc nesmí chybět kvalitní displej a rychlé úložiště ** Za dalších deset tisíc můžete dostat navíc styl nebo výkonnější komponenty ** Vybírat můžete z různých velikostí i konstrukcí

8.  12.  2016 | Stanislav Janů | 85


reklama