Přestože ASP.NET a .NET obecně umožňují provádět s XML a XSLT širokou škálu operací, přetransformovat dokument pomocí základní šablony je velmi jednoduché. V tomto článku si ukážeme elementární postup při provádění této operace a abychom se nenudili, trochu si ho okořeníme použitím XSLT Style Sheet parametrů.

Nejdříve musíme mít nějaký zdroj dat ve formátu XML. Použijeme třeba tento jednoduchý soubor:

<?xml version=“1.0″ encoding=“iso-8859-2″ ?>
<UserList>
 <User ID=“00001″>
  <FullName>Radek Jicha</FullName>
  <Nick>rj</Nick>
  <Email> radek_jicha@hotmail.com </Email>
 </User>
 <User ID=“00002″>
  <FullName>Bill Gates</FullName>
  <Nick>billg</Nick>
  <Email>bill_gates@hotmail.com</Email>
 </User>
 <User ID=“00003″>
  <FullName>Dino Esposito</FullName>
  <Nick>dino</Nick>
  <Email>dino@hotmail.com</Email>
 </User>
</UserList>

Zde není moc co vysvětlovat, proto jdeme k XSL šabloně. Tak trochu předpokládám, že XSL všichni ovládáte, proto hlubší osvětlení opomenu. (Pokud se mýlím, můžete vše napravit díky seriálu Kompletní průvodce XSLT.) Koneckonců, naše vzorová šablona není složitá:

<?xml version=“1.0″ encoding=“iso-8859-2″ ?>
<xsl:stylesheet version=“1.0″ xmlns:xsl=“http://www.w3.org/1999/XSL/Transform“>
 <xsl:param name=“sortby“ />
 <xsl:template match=“/“>
 <table border=“1″ cellpadding=“2px“ cellspacing=“0″ style=“border: 1px solid gray“>
  <tr>
   <td colspan=“4″>List of users</td>
  </tr>
  <tr >
   <td>ID</td>
   <td>Nick</td>
   <td>Jmeno</td>
   <td>Email</td>
  </tr>
   <xsl:for-each select=“UserList/User“>
    <xsl:sort select=“./*[local-name() = $sortby]“ />
    <tr>
    <td><xsl:value-of select=“@ID“/></td>
    <td><xsl:value-of select=“Nick“ /></td>
    <td><xsl:value-of select=“FullName“ /></td>
    <td><xsl:value-of select=“Email“ /></td>
   </tr>
  </xsl:for-each>
 </table>
 </xsl:template>
</xsl:stylesheet>

Jak už jsem řekl, vysvětlovat XSL zde nebudu, jen se pozastavím u jednoho výrazu. Podívejte se na <xsl:sort select="./*[local-name() = $sortby]" />. Výraz v atributu „select“ musí být vyhodnocen pro každý uzel vrácený cyklem <xsl:for-each>, abychom získali pozici daného uzlu v posloupnosti (podle hodnoty vrácené výrazem). Kdybychom použili pouze <xsl:sort select="$sortby" />, což je stejná hodnota pro každý procházený uzel, nebyl by seznam seřazený.

Už máme data a šablonu, nyní se můžeme podívat na kód, který to na serveru dá všechno dohromady a vypustí do světa HTML:

<%@ Page Language=“C#“ Debug=“true“ %>
<%@ import Namespace=“System.IO“ %>
<%@ import Namespace=“System.Xml.XPath“ %>
<%@ import Namespace=“System.Xml.Xsl“ %>
<script runat=“server“>
 protected string SortBy = „“;
 void HandleSorting(Object sender, CommandEventArgs e)
 {
  if (e.CommandName == „SortBy“)
  {
   SortBy = e.CommandArgument.ToString();
  }
 }
</script>
<html>
 <head>
  <title>XML a XSLT</title>
 </head>
 <body style=“FONT-SIZE: 11px; FONT-FAMILY: Tahoma“>
  <form runat=“server“>
   Seřadit podle:
   <asp:LinkButton id=“SortByID“ runat=“server“ OnCommand=“HandleSorting“ CommandArgument=“ID“ CommandName=“SortBy“>ID</asp:LinkButton>
   &nbsp;::
   <asp:LinkButton id=“SortByName“ runat=“server“ OnCommand=“HandleSorting“ CommandArgument=“FullName“ CommandName=“SortBy“>jména</asp:LinkButton>
   &nbsp;::
   <asp:LinkButton id=“SortByNick“ runat=“server“ OnCommand=“HandleSorting“ CommandArgument=“Nick“ CommandName=“SortBy“>nicku</asp:LinkButton>
   <hr noshade=“noshade“ size=“1″ />
   <%
    XPathDocument dokument = new XPathDocument(Server.MapPath(„Users.xml“));
    XslTransform xsl = new XslTransform();
    xsl.Load(Server.MapPath(„Users.xslt“));
    XsltArgumentList arglist = new XsltArgumentList();
    arglist.AddParam(„sortby“, „“, SortBy);
    xsl.Transform(dokument, arglist, Response.OutputStream);
   %>
  </form>
 </body>
</html>

Nejdříve musíme importovat příslušné jmenné prostory (System.IO, System.Xml.XPath a System.Xml.Xsl). V našem formuláři máme tři ovládací prvky typu < asp:LinkButton />, které se liší pouze v id (pochopitelně) a ve vlastnosti „CommandArgument“. Po klepnutí na tlačítko se zavolá metoda HandleSorting(), která do proměnné „string SortBy“ (defaultně prázdné) uloží název sloupce, podle kterého se má seznam seřadit.

A nakonec nám zbyl samotný kód, který transformaci provádí. První, co musíme udělat, je načíst soubor XML do objektu typu XPathDocument. Dále načteme šablonu do objektu XslTransform a vytvoříme objekt reprezentující argumenty pro naši šablonu (XsltArgumentList). V té máme pouze jeden argument „sortby“, metoda XsltArgumentList.Load() však očekává parametry tři. První je název (tak jak jsme ho definovali v šabloně), druhým je jmenný prostor (jelikož jsme jmenné prostory nepoužili, ponecháme prázdné) a nakonec je samotný parametr. Právě tam uložíme hodnotu proměnné „SortBy“, která se bude měnit podle toho, na které tlačítko uživatel klepne. K provedení transformace už stačí jen zavolat přetíženou metodu XslTransform.Transform(), které (v tomto příkladě) předáme náš XPathDocument, seznam argumentů a určíme výstup.

Jak vidno, použití XSLT v ASP.NET je skutečně jednoduché a přitom velmi slibné. Vyzkoušejte si ukázku (zdrojový kód).

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