SQL export do Wordu, 2. část: XSLT

V prvním díle mého krátkého seriálu o exportu z MsSQL do Wordu jsem popsal jak lze přímo pomocí T-SQL z databáze elegantně vygenerovat XML. Tentokrát se zaměřím na to, jak s XML pracovat, konkrétně jak ho transformovat do jiné XML struktury. Většina z vás už možná uhodla, že budu mluvit o XSL transformacích. XSLT (eXtensible Stylesheet Language – Transformations) je společně s XML Schematy páteřní technologií celého XML stacku. Je to v podstatě domain-specific programovací jazyk se syntaxí v XML, jehož cílem je zprostředkovat převod XML dokumentu

  • do jiné XML struktury,
  • do HTML (což není úplně validní XML)
  • nebo do prostého textu (což může znamenat i jiný textově orientovaný značkovací jazyk, třeba CSV).

Základním konceptem XSLT je template (element template). Správně napsaná transformace je souborem několika takových template, které na sebe vzájemně odkazují. Každý template by pak měl obsahovat alespoň:

  • vyhledávací podmínku (atribut match), což je XPath výraz při jehož naplnění se template aktivuje.
  • výstupní pravidla (obsah elementu) skládající se přímo ze značek cílového formátu, z volání jiných templatů a z XSLT control-flow elementů.

Přestože je možné psát templaty tak, aby připomínaly procedurální programy (jsou k dispozici například xsl:if nebo xsl:for-each), tak best-practice je se jim vyhnout. Místo nich je vhodné preferovat použití řetězení xsl:apply-template. Tam, kde je potřeba získat přímo hodnotu nebo XPath výpočet, se samozřejmě nevyhneme ještě xsl:value-of. Následující ukázka demonstruje jednoduchou šablonu, která výstup z minulého dílu přetransformuje do HTML reportu. I když požadovaným výstupem je Wordovský dokument, určitě se zákazník nebude zlobit, když bude mít možnost generovat také webovou stránku.

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
		xmlns="http://www.w3.org/1999/xhtml"
		xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
		xmlns:survey="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/IndividualSurvey"
>
<xsl:output method="html" indent="yes"/>
<xsl:template match="/Customers">
	<html>
		<head><title>Zákazníci</title></head>
		<style>table, tr, th, td { border:1px black solid; }</style>
		<body>
			<h1>Seznam zákazníků</h1>
			<xsl:apply-templates select="Customer" />
		</body>
	</html>
</xsl:template>
<xsl:template match="Customer">
	<hr />
	<h2><xsl:value-of select="concat(@name,' ',@surname,' (',@accountNumber,')')"/></h2>
	<p>
		<xsl:apply-templates select="survey:IndividualSurvey/survey:BirthDate" />
		<xsl:apply-templates select="survey:IndividualSurvey/survey:DateFirstPurchase" />
	</p>
	<xsl:apply-templates select="Order" />
</xsl:template>
<xsl:template match="survey:BirthDate">
	Narozen: <xsl:value-of select="."/><br/>
</xsl:template>
<xsl:template match="survey:DateFirstPurchase">
	První nákup: <xsl:value-of select="."/><br/>
</xsl:template>
<xsl:template match="Order">
	<h3><xsl:value-of select="count(preceding-sibling::Order)+1"/>. Objednávka (<xsl:value-of select="@orderNumber"/>)</h3>
	<p>
		Cena: <xsl:value-of select="@itemPrice"/><br />
		Daň: <xsl:value-of select="@tax"/><br />
		Poštovné: <xsl:value-of select="@shipping"/><br />
		<strong>Cena celkem: <xsl:value-of select="@totalPrice"/></strong>
	</p>
	<table>
		<tr>
			<th>Jméno</th>
			<th>Ks</th>
			<th>Cena</th>
		</tr>
		<xsl:apply-templates select="Item" />
	</table>
</xsl:template>
<xsl:template match="Item">
	<tr>
		<td><xsl:value-of select="@name"/></td>
		<td><xsl:value-of select="@quantity"/></td>
		<td><xsl:value-of select="@totalPrice"/></td>
	</tr>
</xsl:template>
</xsl:stylesheet>

Příští díl už věnuji tomu, jak konečně dostat naše data do Wordu. A pro ty, kteří se rozhodli po přečtení tohoto článku naučit XSLT, doporučuji začít e-knihou Jirky Koska XSLT v příkladech, nebo tutoriálem XSLT na w3schols.

Zanechat odpověď

Vyplňte detaily níže nebo klikněte na ikonu pro přihlášení:

Logo WordPress.com

Komentujete pomocí vašeho WordPress.com účtu. Odhlásit /  Změnit )

Google photo

Komentujete pomocí vašeho Google účtu. Odhlásit /  Změnit )

Twitter picture

Komentujete pomocí vašeho Twitter účtu. Odhlásit /  Změnit )

Facebook photo

Komentujete pomocí vašeho Facebook účtu. Odhlásit /  Změnit )

Připojování k %s