Přejít k navigační liště

Zdroják » Webdesign » Generujeme jednoduchý web pomocí XML

Generujeme jednoduchý web pomocí XML

Články Webdesign

Staticky generované weby byly poměrně dlouho v ústraní. Jako by se zdálo, že redakční systém je univerzální řešení, vhodné i pro ty nejmenší prezentace. Poslední dobou se ale začínají statické weby opět prosazovat – jednak díky cloudovým úložištím, které lze použít místo serveru, jednak i kvůli schopnostem HTML.

Weby jsou různé – někdy jsou branou ke komplexnímu informačnímu systému, jedním z jeho rozhraní, jindy jsou přehlídkou grafického nadání svého tvůrce, nebo naopak solidní prezentací firmy, jindy zase užitečnou aplikací. Ale i u těch nejjednodušších webů musíme řešit úkoly jako: jak dostat hlavní nabídku na všechny stránky (rámce už se dneska moc nenosí), jak aktualizovat vzhled webu, aniž bychom museli měnit všechny stránky ručně jednu po druhé, jak vložit na stránky opakující se části (např. naši adresu nebo název firmy), jak si usnadnit práci…

Programátoři jsou tvorové od přírody líní, ale zvídaví, a tak než aby půl hodiny otrocky ručně přepisovali spousty souborů, raději stráví několik hodin vývojem nástroje, který to udělá za ně. Nebo použijí nějaký hotový. Weby taky nemusíme psát ručně – můžeme si pomoci nějakým šikovným generátorem. A právě tvorbu takového generátoru si v dnešním článku ukážeme. Výstupem budou statické (X)HTML stránky.

Nevýhody statického webu jsou zřejmé a často limitující – jaké jsou ale jeho výhody? Proč bychom mohli chtít statické stránky, když můžeme mít dynamické?

  • Offline média: (X)HTML stránky nemusí být umístěné jen na webovém serveru, např. můžeme chtít rozdávat CDčka či USB flash disky svým zákazníkům nebo návštěvníkům konference, a pak je hezké, když uživatel dostane i trochu té grafiky a přehledné navigace místo holých souborů a adresářů.
  • Servery s omezenou funkcionalitou: statické stránky (třeba dokumentaci, návod, směrnice) můžeme vystavit na obyčejný sdílený disk a ten poslouží stejně dobře jako webový server. Statické stránky dále můžeme nahrát i na velmi malá zařízení (např. router s minimem paměti a pomalým procesorem nebo nějaký jednočip), na kterých běží jednoduchý HTTP server (ale na provoz nějakého skriptování už tu není kapacita). Příkladem může být i cloudové úložiště, jako je Amazon S3 – v něm můžete svou statickou prezentaci vytvořit během několika minut.
  • Jednoduchost a odolnost proti výpadkům: čím jednodušší systém bude, tím méně se toho může pokazit. Nemusíte řešit, jestli máte na webhostingu správnou verzi PHP, jestli běží databáze nebo jestli jsou nainstalované všechny potřebné knihovny. Statický web jednou vygenerujete, zkontrolujete a od té doby se na něm nemá co rozbít. Také je možné ho neomezeně škálovat – jednoduše nahrajeme soubory na více serverů – výkon pak předčí i libovolnou noSQL databázi, protože jednodušší už to být nemůže (v krajním případě nahrajeme stránky do tmpfs souborového systému a budou se servírovat přímo z paměti).
  • Bezpečnost: možná už jste narazili na www stránku tvořenou jedním PHP skriptem, jehož jediným úkolem bylo vložit menu a zvolenou stránku na základě GET parametru. Jenže byl tak špatně napsaný, že přes něj šlo získat libovolný soubor ze serveru. Se statickým webem tohle neriskujete, spravovat takový web je proto nenáročné a lze to svěřit leckomu – ne jako programování, kde špatný programátor je jako neřízená střela a může způsobit, že se z vašeho serveru stane doupě spamerů nebo rhybářské centrum pro celou střední Evropu. Také nepotřebujete odborníky na testování nebo revize kódu.
  • Nostalgie: možná taky pamatujete dobu, kdy web začínal a kdy jste na něj pověsili svoji první stránku. Tehdy bylo úplně jedno, že jste nepoužívali žádnou metodiku vývoje a že váš program nestavěl na žádném světoznámém frameworku. Šlo o čistou radost z toho, že se na váš výtvor může podívat kdokoli na světě.

Použité technologie

XML: nebudeme nosit sovy do Athén – webdesignéři jistě znají – jen pro pořádek je nutno uvést, že náš generátor staví na metajazyce XML (vstup, výstup i samotný program je napsaný v XML).

XSL: pro převod vstupních souborů vytvořených uživatelem na hotové www stránky použijeme jazyk XSL, který slouží k transformaci jednoho XML v jiné XML (případně v text – např. si pomocí XSL transformace můžete vygenerovat dokument v LaTeXu a dosáhnout typograficky kvalitního výstupu). Původně byl tento jazyk určen k formátování/vi­zualizaci XML dokumentů, nicméně dnes se používá pro zcela obecné transformace mezi různými datovými formáty a „opravdovému“ programování.

XPath: v rámci našich XSL transformací využijeme dotazovacího jazyka XPath, který nám umožní snadno a přehledně adresovat jednotlivé elementy nebo části XML stromu. Čím je pro relační databáze SQL, tím je pro XML dokumenty a databáze XPath.

Ant: nástroj pro sestavení (build) programu, něco jako GNU Make, ale používaný hlavně ve světě Javy. Ant obsahuje vestavěnou úlohu pro zavolání XSL transformace, takže díky němu můžeme spustit generování s minimem úsilí (nemusíme nic programovat nebo skriptovat, jen deklarujeme, co, kam a pomocí jaké šablony se má převést – a postará se i o další věci jako je kopírování statického obsahu nebo úklid).

První XSL transformace

Ještě než začneme, nainstalujeme si Ant. V linuxových distribucích na bázi Debianu/Ubuntu tak učiníme pomocí příkazu:

aptitude install ant

Ve Fedoře k témuž poslouží:

yum install ant

Abychom měli co transformovat, vytvoříme si nějaký vstupní dokument. Obyčejně se v této fázi vyplatí poctivá analýza a trochu toho přemýšlení, protože formát, který si na začátku definujeme, nás bude provázet možná až do hrobu. Ovšem teď nám o nic nejde, jen tak si hrajeme, takže prostě zbastlíme úplně jednoduchý dokument:

<velmiJednoduchýXmlDokument xmlns="https://trac.frantovo.cz/xml-web-generator/wiki/xmlns/strana">
    <nadpis>Ahoj světe!</nadpis>
    <obsah xmlns="http://www.w3.org/1999/xhtml">

        Lorem ipsum, nějaký text dokumentu, bla <b>bla</b>, bla.
    </obsah>
</velmiJednoduchýXmlDokument>

Dokument popisuje jednu www stránku – její nadpis a obsah. Nyní napíšeme XSL šablonu, která z tohoto obskurního formátu (který jsme právě lehkomyslně stvořili) vyrobí standardní XHTML. Šablona vypadá následovně:

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="2.0"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://www.w3.org/1999/xhtml"
    xmlns:s="https://trac.frantovo.cz/xml-web-generator/wiki/xmlns/strana"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

    xmlns:fn="http://www.w3.org/2005/xpath-functions"
    exclude-result-prefixes="fn h s xs">
    <xsl:output method="xml" indent="yes" encoding="UTF-8"
        doctype-public="-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN"
        doctype-system="http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd"/>

    <!-- (1) -->
    <xsl:template match="/">
        <html>
            <head>
                <title><xsl:value-of select="s:velmiJednoduchýXmlDokument/s:nadpis"/></title>
            </head>

            <body>
                <h1><xsl:value-of select="s:velmiJednoduchýXmlDokument/s:nadpis"/></h1>
                <p>
                    <xsl:apply-templates select="s:velmiJednoduchýXmlDokument/h:obsah/node()"/>

                </p>
            </body>
        </html>
    </xsl:template>

    <!-- (2) -->
    <xsl:template match="*">

        <xsl:element name="{name()}">
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>

    <!-- (3) -->
    <xsl:template match="h:b">
        <strong><xsl:apply-templates/></strong>
    </xsl:template>

</xsl:stylesheet>

XSL styl (formátovací sada) obsahuje jednotlivé šablony (<xsl:template/>). Pomocí jejich atributu match říkáme, na co se mají aplikovat. První šablona se aplikuje na celý vstupní dokument a postará se o potřebné HTML hlavičky, dále vloží nadpis do titulku i do <h1/>. Vlastní obsah stránky (to, co je uvnitř <obsah/>) už přenechá na ostatních šablonách.

Druhá šablona se aplikuje na všechny elementy a kopíruje je na výstup. Aby to nebyla taková nuda, třetí šablona se stará o <b/> elementy a převádí je na <strong/>. Všimněte si, že přednost mají šablony s užším zaměřením – místo univerzální (2) se na <b/> elementy aplikuje konkrétnější (3).

Nyní přichází ke slovu Ant – pomocí něj zavoláme transformaci a získáme výstup. Výchozím řídícím souborem pro Ant je build.xml, je to něco jako Makefile. V úvodu jsme si slíbili, že to bude jednoduché a deklarativní, tak tedy budiž:

<project name="xhtml-web" default="generuj">
    <target name="generuj">
        <xslt   in="vstup.xml"
                out="výstup.xhtml"

                style="šablona.xsl">
        </xslt>
    </target>
</project>

Všechny tři soubory ( vstup.xml, šablona.xsl a build.xml) máme v jednom adresáři a v něm zadáme příkaz ant. Dostaneme přibližně následující výpis:

Buildfile: ~/ukázka-xslt/build.xml

generuj:
     [xslt] Processing ~/ukázka-xslt/vstup.xml to ~/ukázka-xslt/výstup.xhtml
     [xslt] Loading stylesheet ~/ukázka-xslt/šablona.xsl

BUILD SUCCESSFUL
Total time: 1 second

Během okamžiku nám Ant vyrobil soubor výstup.xhtml s následujícím obsahem:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN" "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Ahoj světe!</title>
</head>
<body>

    <h1>Ahoj světe!</h1>
    <p>
        Lorem ipsum, nějaký text dokumentu, bla <strong>bla</strong>, bla.
    </p>
</body>

</html>

Už i u takto jednoduché úlohy sklízíme první ovoce našeho počínání – když budeme chtít do stránek doplnit třeba odkaz na JavaScript nebo CSS stylopis, doplníme ho jen do XSL šablony a nebudme muset upravovat jednotlivé vstupní dokumenty.

Teď už doopravdy

Po nezbytném „hello world“ příkladu se pustíme do skutečné práce. Naším cílem bude generátor jednoduchých statických webů, na který budeme mít následující požadavky:

  • Ze sady vstupních XML dokumentů (v našem vlastním formátu) vyrobí sadu validních XHTML dokumentů (nebudeme tedy dokumenty převádět po jednom a vyjmenovávat je v  build.xml).
  • Statický obsah (JavaScripty, CSS styly, obrázky) zkopíruje do výstupního adresáře.
  • Do každé stránky přidá záhlaví a zápatí, které definujeme v samostatných souborech.
  • Na každé stránce bude nabídka (navigace) s odkazy na ostatní stránky.
  • Některé stránky v hlavní nabídce nebudou (ale transformují se společně s ostatními).
  • Vytvoříme si „makro“, které bude sloužit k vkládání opakujícího se textu (např. adresa firmy).
  • Automaticky se vyrobí agregované výstupy: RSS, Atom, sitemap.xml.
  • Generátor si poradí s češtinou a mezerami v názvech souborů.

Takže náš generátor bude fungovat asi takhle:

Protože budeme používat i některé vlastnosti z XSLT 2.0, přizveme si na pomoc Saxon (XSLT procesor od Michaela Kaye). Nainstalujeme si také mercurial (bude se nám hodit později ke stažení zdrojových kódů generátoru):

aptitude install ant libsaxonb-java mercurial

Ve Fedoře:

yum install ant mercurial saxon.noarch

Vstupní formát

Vstupní XML formát (pomocí kterého popisujeme stránky) musíme rozšířit, aby odpovídal našim požadavkům:

<stránka xmlns="https://trac.frantovo.cz/xml-web-generator/wiki/xmlns/strana">
    <nadpis>Vítejte na našem webu!</nadpis>

    <perex>Úvodní stránka našeho webu.</perex>
    <pořadí>10</pořadí>

    <text xmlns="http://www.w3.org/1999/xhtml">
        <p>sem píšeme normální HTML značky</p>
    </text>

</stránka>

Perex využijeme v RSS/Atom výstupech (případně bychom ho mohli zobrazovat v title  atributu odkazů). Protože budeme chtít mít nabídku nějak uspořádanou (typicky úvod jako první a kontakt jako poslední), poznačíme si u každé stránky, kolikátá má být v nabídce (mezi čísly je lepší dělat větší mezery, abychom mohli později vložit další stránky mezi ně a nemuseli přečíslovávat).

Společná konfigurace

Dále si navrhneme konfigurační soubor web.conf, který bude obsahovat metadata pro celý náš web. V něm definujeme společné CSS styly a JavaScripty, autora atd. Později sem můžeme přidat třeba klíčová slova nebo další parametrizaci.

<web xmlns="https://trac.frantovo.cz/xml-web-generator/wiki/xmlns/konfigurace">
    <název>Chovatelská stanice tučňáků</název>
    <podtitul>vše pro tučňáky</podtitul>
    <autor>

        <jméno>František Kučera</jméno>
        <email>anonym@example.com</email>
    </autor>

    <!-- Základní URL našeho webu – pro generování RSS/Atom -->
    <url>https://frantovo.cz/projekty/xml-web-generator/demo1/</url>


    <!-- ID našeho webu (každý by si měl vygenerovat svoje) – pro Atom -->
    <uuid>399a714c-956e-444c-a8f4-afe8f0df802a</uuid>

    <!-- Kód našeho webu, použije se jako součást identifikátoru položek v RSS/Atomu -->
    <kod>PokusnyWeb123</kod>

    <!-- Odkazy na JavaScripty a kaskádové styly -->

    <css>css/styl.css</css>
    <js>js/skript.js</js>

</web>

Pokud budeme chtít vložit víc CSS nebo JavaScriptů, nebudeme vymýšlet žádné hlouposti jako oddělování hodnot čárkou, ale jednoduše do web.conf vložíme více elementů <css/> nebo <js/>.

Úprava antovského build.xml

Stránek už máme více a určitě se nám nebude chtít je všechny vypisovat v antovském build.xml, takže si ho trochu upravíme, aby se transformovaly všechny soubory ve vstupním adresáři.

<xslt basedir="${vstup}" destdir="${výstup}" includes="*${vstupníPřípona}" extension="${výstupníPřípona}" style="${šablona}/stránka.xsl">
    <param name="vstupníPřípona" expression="${vstupníPřípona}"/>
    <param name="výstupníPřípona" expression="${výstupníPřípona}"/>

    …
</xslt>

Teď už se pustíme do úpravy XSL šablony:

Vkládání záhlaví a zápatí

Ant volá XSLT procesor a říká mu, jaký vstup (např. index.xml) má transformovat na jaký výstup ( index.xhtml) pomocí jaké šablony ( stránka.xsl). Jenže my potřebujeme kromě vstupu vložit do výstupního XHTML ještě jiný soubor (záhlaví a zápatí). Jak na to? Použijeme funkci document():

<xsl:apply-templates select="document(fn:encode-for-uri(concat($vstup, 'záhlaví', $vsuvkováPřípona)))/s:stránka/h:text/node()"/>

Záhlaví se nachází v souboru záhlaví.inc a má stejnou strukturu jako ostatní stránky. Sestavovací skript ( build.xml) máme parametrizovaný, abychom mohli měnit vstupní/výstupní adresáře nebo přípony souborů – v XSL pak máme tyto parametry přístupné přes proměnné (zde $vstup je vstupní adresář a $vsuvkováPřípona je .inc).

Pomocí <xsl:apply-templates/> aplikujeme šablony (naše výchozí univerzální šablona jen kopíruje, viz úvodní příklad), na externí dokument. Ovšem ne na celý, ale jen na jeho podstrom (nezajímají nás metadata záhlaví, ale jen to, co je uvnitř elementu <text/>). Tohoto výběru dosáhneme pomocí XPath dotazu /s:stránka/h:text/node().

Funkce concat(), jak název napovídá, slouží ke spojování řetězců a funkce encode-for-uri() se postará o kódování URL (tady bychom mohli natvrdo napsat z%C3%A1hlav%C3%AD.inc, ale později budeme potřebovat kódovat proměnlivé texty).

Obsah – nabídka

Vkládat externí dokumenty už umíme. Teď ale potřebujeme načíst celý vstupní adresář, resp. jen soubory se správnou příponou ( xml), přečíst si jejich název/titulek (bude jiný než název souboru) a vložit odkaz do nabídky na všechny stránky. Do šablony proto napíšeme:

<ul id="nabídka">
    <xsl:for-each select="collection(concat('../', $vstup ,'/?select=*', $vstupníPřípona))[s:stránka/s:pořadí]">
        <xsl:sort select="./s:stránka/s:pořadí"/>

        <li>
            <xsl:variable name="xmlSoubor" select="tokenize(document-uri(.), '/')[last()]"/>
            <xsl:variable name="xhtmlSoubor" select="replace($xmlSoubor, $vstupníPřípona, $výstupníPřípona)"/>
            <a href="{fn:encode-for-uri($xhtmlSoubor)}"><xsl:value-of select="./s:stránka/s:nadpis"/></a>

        </li>
    </xsl:for-each>
</ul>

Funkce collection() nám vrátí kolekci dokumentů, skrz kterou budeme iterovat <xsl:for-each/>, ale omezíme se jen na stránky, které mají definované pořadí (když stránka pořadí nemá, znamená to, že ji v hlavní nabídce nechceme), k tomu slouží podmínka [s:stránka/s:pořadí].

Z URI dokumentu si vezmeme název souboru a přepíšeme příponu (výstupní soubory jsou .xhtml, zatímco vstupní .xml).

Na všech stránkách teď máme krásnou nabídku s odkazy na ostatní stránky našeho webu.

XPath dotazy typu /s:stránka/h:text/node() můžeme zhruba přirovnat k projekci v SQL, zatímco XPath dotazy obsahující hranaté závorky [s:stránka/s:pořadí] jsou zase podobné restrikci v SQL (WHERE podmínky). Ovšem neberte prosím toto přirovnání úplně doslova – zde totiž nepracujeme s relacemi, ale se stromovými XML dokumenty.

Píšeme vlastní „makra“

Náš generátor bude podporovat „makra“ (ve skutečnosti to jsou zase šablony), do vstupního dokumentu napíšeme např. <m:adresaFirmy/> a do výstupních XHTML souborů se vloží správná adresa – ta je definovaná pěkně na jednom místě, takže kdybychom se přestěhovali, změníme ji jen v šabloně, resp. definici makra.

Příklad s adresou by byl až urážlivě jednoduchý, tak si ukážeme něco zajímavějšího. Makra si můžeme parametrizovat. Uděláme si tedy makro, které vykreslí měřák:

Do vstupních dokumentů pak budeme psát pouze:

<m:měřák hodnota="95"/>

A do výstupu se nám vygeneruje všechno potřebné XHTML (případně styly nebo JavaScripty, budou-li potřeba). K tomu poslouží následující šablona (v terminologii našeho generátoru „definice makra“):

<xsl:template match="m:měřák">

    <xsl:variable name="hodnota" select="number(@hodnota)"/>
    <xsl:variable name="šířkaGrafu" select="128"/>
    <xsl:choose>
        <xsl:when test="$hodnota &gt;= 0 and $hodnota &lt;= 100">
            <div style="border: 1px solid black; width: {$šířkaGrafu}px; height: 16px; padding: 0px; text-align: center; background-color: #cfc;">
                <div style="margin: 0px; background-color: #A4E666; width: {@hodnota*$šířkaGrafu div 100}px; height: 16px;"></div>

                <p style="margin: 0px; font-size: 12px; position: relative; top: -15px;">
                    <xsl:value-of select="@hodnota"/>/100
                </p>
            </div>
        </xsl:when>
        <xsl:otherwise>

            <xsl:message terminate="yes">Hodnota měřáku musí být nejméně 0 a nejvíce 100 (udává procenta).</xsl:message>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

Nejprve zkontrolujeme, zda hodnota dává smysl – měla by být od nuly do sta a představuje procenta. Když tomu tak není, dáme uživateli najevo, že takhle by to nešlo – k tomu použijeme XSL zprávu. Nastavíme jí terminate="yes", takže generování skončí chybou – místo aby v tichosti pokračovalo a na výstupu pak byly nesmysly. Tento přístup (selhat co nejdříve – dáváme přednost bezchybnosti před robustností) si zde můžeme dovolit, protože uživatel, který vytvořil vstupní data, je nablízku a může chybu okamžitě opravit (což je taky dobře). Kdyby se tento proces prováděl někde na serveru bez asistence uživatele, pravděpodobně bychom se vydali jinou cestou – pokusili se z chyby nějak zotavit a dodat raději nepřesný/nekom­pletní výstup než žádný ( terminate="yes" bychom nepoužili a chybu jen někam zalogovali pro pozdější opravení).

Jen tak mimochodem jsme se přiučili, jak se píše if/then/else větvení v XSL. Nebylo to těžké, že ne?

Agregované výstupy

Na webu se velmi vyplatí poskytovat krmivo pro čtečky v podobě RSS a Atom výstupů. Návštěvníci si přidají náš kanál do čtečky a hned se dozví o každé novince na našem webu, aniž by tam museli chodit a ručně kontrolovat. Náš web je sice jednoduchý a statický a nový obsah na něj budeme přidávat třeba jen jednou za čtrnáct dní, ale není to žádný otloukánek – RSS/Atom bude mít taky, jako všechny ty dynamické weby kolem.

Také vytvoříme sitemap.xml pro Google, aby se mu naše stránka lépe indexovala (ano, mohli bychom mu předhodit Atom, ale když s XSL to jde úplně samo, tak si ukážeme i Sitemap).

Jelikož nezanedbáváme analýzu, muselo nás napadnout, že ve všech třech agregovaných výstupech (RSS, Atom, Sitemap) jsou stejné informace (výpis stránek, ke každé název a odkaz, případně popis). Dává tedy smysl načíst je jen jednou (jednou zpracovat vstupní soubory) a následně z nich vygenerovat tři různé výstupy. Mohli bychom tedy vytvořit nějaký meziformát, který by obsahoval potřebné hodnoty, a následně bychom tento polotovar transformovali do tří vstupů. Ale nebudeme přece trpět NIH syndromem – nebudeme vymýšlet nový vlastní formát, když už tu jeden hotový a standardizovaný je: Atom – použijeme ho jak v roli meziformátu, tak v roli výstupního formátu.

Proces bude tedy vypadat tak, že vygenerujeme nejdříve Atom a z něj potom zylé dva výstupy. Šablonu pro Atom vložíme do samostatného souboru atom.xsl:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
    xmlns="http://www.w3.org/2005/Atom"

    xmlns:s="https://trac.frantovo.cz/xml-web-generator/wiki/xmlns/strana"
    xmlns:k="https://trac.frantovo.cz/xml-web-generator/wiki/xmlns/konfigurace"
    xmlns:j="java:cz.frantovo.xmlWebGenerator.Funkce"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:fn="http://www.w3.org/2005/xpath-functions"

    exclude-result-prefixes="fn s k j">
    <xsl:output    method="xml" indent="yes" encoding="UTF-8"/>

    <xsl:param name="vstupníPřípona" select="'.xml'"/>

    <xsl:param name="výstupníPřípona" select="'.xhtml'"/>

    <xsl:template match="/">

        <feed>
            <title><xsl:value-of select="k:web/k:název"/></title>

            <subtitle><xsl:value-of select="k:web/k:podtitul"/></subtitle>
            <link rel="self" href="{concat(k:web/k:url, 'atom.xml')}"/>
            <link href="{k:web/k:url}"/>
            <updated><xsl:value-of select="current-dateTime()"/></updated>
            <author>

                <name><xsl:value-of select="k:web/k:autor/k:jméno"/></name>
                <email><xsl:value-of select="k:web/k:autor/k:email"/></email>
            </author>
            <id><xsl:value-of select="concat('urn:uuid:', k:web/k:uuid)"/></id>


            <xsl:variable name="konfigurace" select="/"/>
            <xsl:for-each select="collection(concat('../vstup/?select=*', $vstupníPřípona))[empty(s:stránka/s:skrytá) or not(s:stránka/s:skrytá)]">
                <entry>
                    <title><xsl:value-of select="s:stránka/s:nadpis"/></title>

                    <xsl:variable name="soubor" select="replace(tokenize(document-uri(.), '/')[last()], $vstupníPřípona, '')"/>
                    <link href="{concat($konfigurace/k:web/k:url, encode-for-uri($soubor), $výstupníPřípona)}" />
                    <id><xsl:value-of select="concat('urn:', $konfigurace/k:web/k:kod ,':strana:', encode-for-uri($soubor))"/></id>
                    <updated><xsl:value-of select="j:posledníZměna(document-uri(.))"/></updated>

                    <summary><xsl:value-of select="s:stránka/s:perex"/></summary>
                </entry>
            </xsl:for-each>

        </feed>
    </xsl:template>


</xsl:stylesheet>

Zde využijeme konfigurační soubor našeho webu ( web.conf) a načteme si z něj název webu, základní URL pro absolutní odkazy, jméno a e-mail autora.

Pro zjištění data a času poslední aktualizace souboru použijeme jednoduchou funkci napsanou v Javě (ano, i v Javě se dají psát funkce, i když se formálně jmenují metody):

public class Funkce {
        public static Date posledníZměna(String soubor) throws URISyntaxException {
                return new Date(new File(new URI(soubor)).lastModified());
        }
}

V XSL šabloně si ji zpřístupníme pomocí jmenného prostoru xmlns:j="java:cz.frantovo.xmlWebGenerator.Funkce" (obsahuje plný název třídy, ve které jsou statické metody-funkce). A pak ji voláme pomocí: j:posledníZměna(document-uri(.))

Následný převod z Atom formátu do RSS a Sitemapu je triviální. Jen u RSS musíme přeformátovat datum:

<pubDate><xsl:value-of select="format-dateTime(a:updated,
    '[FNn,*-3], [D01] [MNn,*-3] [Y0001] [H01]:[m01]:[s01] [Z]',
    'en',
    'ISO',
    'US')"/></pubDate>

Ne tak úplně statický web

Možná vám tu přeci jen pořád něco chybí. Možná byste chtěli web ještě trochu oživit a provádět nějaké operace na serverové straně. XML dokumenty můžou obsahovat tzv. instrukce zpracování (PI – Processing Instruction), což jsou sekce určené jiné aplikaci než je XML procesor. Od zbytku XML dokumentu je tato sekce oddělena ostrými závorkami a otazníkem. Za první závorkou následuje návěští (tzv. PITarget). Asi vám to už něco připomíná… ano, do dokumentu můžeme zapsat i části PHP kódu, třeba <?php echo("Ahoj z PHP!"); ?>. V XSL šabloně vložíme do výstupu instrukce pro zpracování touto značkou:

<xsl:processing-instruction name="php">echo("Ahoj z PHP!");</xsl:processing-instruction>

Ve výstupním dokumentu se nám pak objeví <?php echo("Ahoj z PHP!"); ?> a tento kód zpracuje jiná aplikace, což je v tomto případě PHP interpret na serveru. Generovat tedy můžeme i dynamické stránky a ušetřit si tak otrocké psaní opakujících se částí kódu.

Závěr

Dnešní článek jsem zaměřil hodně prakticky – cílem bylo ukázat možnosti generování webů pomocí XSLT a inspirovat k dalšímu studiu – cílem nebylo zahltit čtenáře teorií – tu si můžete nastudovat z knih a článků nebo ji vstřebávat za chodu. Kompletní zdrojové kódy si můžete stáhnout z mercurialového úložiště příkazem:

hg clone https://hg.frantovo.cz/xml-web-generator

Více o generátoru se dočtete na jeho stránce: XML Web generátor. Je to svobodný software, můžete studovat jeho zdrojový kód a upravovat si ho. Program by měl být k užitku i těm, kdo se nechtějí učit pokročilé technologie – stačí si upravit vstupní soubory a lehce přizpůsobit šablonu, k tomu nemusíte být misry v XPath dotazech.

Odkazy a zdroje

Komentáře

Subscribe
Upozornit na
guest
73 Komentářů
Nejstarší
Nejnovější Most Voted
Inline Feedbacks
View all comments
KapitánRUM

Jen víc takových!

ja.

chcel by som varovat pred pouzitim na velkych dynamickych weboch. Mal som uz 2x tu cest a musim povedat, ze xslt posobi ako absolutna obfuskacia. Co by ste v PHP napisali za pol minuty, v xsl to trva o dost dlhsie. Co by ste v php mali na 9 znakov, v xsl to je na 4 riadky a viac. Nemoznost programovat objektovo to cele uz len zaklincuje.

SB

http://www.php.net/manual/en/xsltprocessor.registerphpfunctions.php ?

Sila XSLT sa prejaví práve pri použití vo veľkých dynamických weboch, na ktorých v jednom momente môže pracovať viac developerských teamov. XSLT v MVC architektúre nájdeš v mnohých komplexných business riešeniach.

fos4

Na co se více hodí PHP použij PHP, na co více XSLT použij XSLT.

Na velke weby se práve XSLT nejvíce hodí, jedna část týmu se věnuje programování kde výstupem je XML a to už si převezmou kodeři a jen píší XSLT + CSS + JS.

Mimo jiné ještě existuje XSLT2 (http://www.w3.org/TR/xslt20/), případně pro PHP exslt (http://www.exslt.org/)

Petr Šmíd

V zásadě souhlasím. Problémem je to, že se to obtížně debuguje.

blizz
10. 5. 2011 9:27 smazal Martin Malý, důvod: Nesouhlas lze vyjádřit i bez vulgarismů…
KapitánRUM

Ale jsi zlý :-D

Yet Another Anonymous Coward

Pro ty, co nemají v lásce XML existuje spousta alternativ: Hakyll, yst, nanoc, jekyll

Osobně bych doporučil Hakyll — podporuje hodně vstupních formátů a má pěknou konfiguraci v Haskellu :)

Díky za tipy, Jekyll mám v „námětech na články“, tak si tam i ty další tipy přidám.

Kibo

Je to pěkné a čisté, ale trochu ukecané a zbytežně pracné.
Využít by přece šlo už hotových templatovacích nástrojů. Napadá mě např.: SiteMesh, FreeMarker ale je jich spusta. (http://en.wikipedia.org/wiki/Template_engine_%28web%29)
V Groovy existuje SimpleTemplate­Engine, XMLBuilder, HTMLBuilder = stejný výsledek za méně námahy.
Tom

Martin Soušek

Moc nechápu, proč ještě v 21. století musíme být ohlupování články o XSLT. Domníval jsem se, že i ti nejzatvrzelejší propagátoři XML uznali, že to je obluda a naprosto slepá ulička.

Asi jsem se mýlil.

Tak tedy znovu: XSLT je nesmysl a pokud chci řešit problém „vygenerovat statický web“, tak na to existuje milion jiných a vhodnějších nástrojů.

Inkvizitor

Ale no tak. XSLT je dobrý nástroj třeba v situacích, kdy je třeba generovat několik různých výstupních formátů pro jeden dokument – třeba plain a html part nějakého automaticky generovaného mailu – tam má koneckonců podobná transformace nezastupitelnou roli vzhledem k tomu, jak jsou MUA nejednotné a pitomé při zobrazování rich textu.

Když někdo zmiňuje milion „jiných a vhodnějších“ nástrojů, očekával bych, že přihodí nějaký odkaz na stránku se srovnáním některých těch „jiných a lepších“ s kritizovanou technologií.

MarSik

Ač ručně psané XML nemám rád, tak na strukturovaný přenos _generovaných_dat_ to tak špatné není. A deklarativní způsob programování je mi také docela blízký, takže bych deklarativní pattern matching transformační jazyk rozhodně za slepou uličku nepovažoval..

Ale zajímalo by mě jaký je tedy jiný, jednodušší a vhodnější nástroj na _obecnou_tran­sformaci_ strukturovaných dat? (Protože třeba převod z docbooku do html|LaTeXu|.. je docela příjemný proces).

Ladislav Thon

> Ale zajímalo by mě jaký je tedy jiný, jednodušší a vhodnější nástroj na _obecnou_tran­sformaci_ strukturovaných dat?

Programovací jazyk. XSLT ostatně není nic jiného, jen je to z programovacích jazyků jeden z těch (nej)příšernějších.

Jiří Kosek

A tenhle podle vás nejpříšernější programovací jazyk má v sobě zabudovaný velice mocný dotazovací jazyk nad datovým modelem, se kterým pracuje. To je pro složitější transformace naprosto klíčová věc. Jazyků, které tohle mají moc není a v těch co to mají (včetně XSLT) napíšete transformace mnohem úspornějším způsobem — to vám asi přijde příšerné, že?

Ladislav Thon

Stoprocentně. XPath lze stejně snadno a občas snáz používat v rozumných vysokoúrovňových knihovnách pro práci s XML. Namísto XSLT bych si kdykoliv vybral kombinaci XmlSlurper + GPath + MarkupBuilder dostupnou v Groovy. Rubysti by pravděpodobně řekli totéž o Nokogiri/hpricotu.

Mimochodem, pro navigaci jsou často mnohem příjemnější CSSkové selektory.

Opravdový odborník :-)

jak se tam dá zpracovat xml Mixed Content?

Inkvizitor

XSLT je DSL šitý na míru určitému typu problémů. Srovnávat jej s jakýmkoliv GPL nedává moc smysl. XSLT samozřejmě nikdo nebude používat namísto běžného jazyka, ale na druhou stranu nelze říci, že alternativou k němu je třeba C++ nebo Java, rozhodně ne bez nějaké srovnatelně mocné knihovny. To by bylo jako srovnávat pilník se soustruhem, nebo ne?

alancox

S tím naprostou souhlasím.

Ale každý, kdo ukáže, že dělá v XML a používá XSLT je prostě světový.

Článek samotný je kvalitní, takže má kritika se netýká článku.

Ale generovat statický web pomocí XSLT mě osobně také přijde jako dost úchylnost. Nicméně stejně jako se teoreticky dá programovat v COBOLu, dá se udělat i XSLT statický web.

Ale XML + XSLT je skutečně už často více náboženství, než odůvodněné použití.

Nadužívání XML a jeho nástrojů je nemoc této doby. A pro tento účel, který popisuje článek je to zhůvěřilost.

Jiří Kosek

Aby vás někdo bral vážně, asi by bylo dobré zmínit alespoň pár z těch milionu vhodnějších nástrojů.

A vzhledem k tomu, že se pracuje na XSLT 3.0 bych to na slepou uličku neviděl.

keff

Nic proti XSLT, to je na spoustu problémů nejlepším řešením, ale argument, že když se na něčem pracuje, tak nejde o slepou uličku, mi moc validní nepřijde :).

Mike

Ale o tomhle dotaz nahoře není – abych se přiznal, také by mě zajímaly nějaké příklady – nemusí jich být milión, ale alespoň něco…

Papouch

Napriklad pro „vygenerovani“ jednoducheho statickeho webu v rozsahu desitek az stovek stranek je porad nejlepsi existujici nastroj Microsoft Frontpage respektive dneska se Expression Web.

Predstava, ze by se systemen popsanym v clanku mel dlouhodobe udrzovat nejaky projekt bez zapojeni programatora je nerealna, zatimco s FP to zvladne (vcetne pripadneho mirneho rozsirovani) i absolvent/ka pajdy po par hodinach zacviku.

FP pravda neni opensource ani zadarmo, na druhou stranu funguje. A cas straveny editovanim enigmatickych XML/XSLT souboru musi nekdo zaplatit.

AnonymníMyš
10. 5. 2011 9:30 smazal Martin Malý, důvod: Pokud nesouhlasíte, dejte to najevo bez vulgarit. Děkujeme.
AnonymníMyš

P.S. touhle etapou jsme si už snad prošli, ne?

AnonymníMyš

Ach, jo, cenzura…

důležitý byl ale význam příspěvku a za tím si stojím:

„zatimco s FP to zvladne … i absolvent/ka pajdy po par hodinach zacviku.“

Ano, weby může dělat každý, ale z takovéhoto softwaru lezou lezou exkrementy, na které ostatní narážejí na webu. Touhle etapou jsme si už snad prošli, ne? Jistým pokrokem byl nástup redakčních systémů, které kontrolují vstup a/nebo formátují text na základě nějaké syntaxe typu BB nebo wiki.

VfB

od prvního dubna uplynul více jak měsíc!

Front Page je jen o něco lepší Word (myšleny stránky vygenerované v MSO)

j

Ehm, a da se vystup z toho uzasnyho nastroje taky nekde zobrazit? Co jsem mel tu cest, tak to nefunguje ani v IE.

VfB

tak to nevím, co jste v tom Front Page napáchal ale pokud si pamatuji, tak nějaký výstup jde ve Front Page vytvořit, dokonce se takové stránky zobrazí ale kód je prasárna

xx

Také se dříve pracovalo na XHTML 2 a slepá ulička to byla (alespoň já to tak vnímám).

K těm jiným nástrojům: Proč nepoužít přímo programovací jazyk, v němž píšu celou aplikaci? Například lispovské jazyky tu byly dříve než SGML a vcelku dobře se v nich pracuje se stromovými strukturami. Nebo v jazycích pro .NET Framework lze použít XLINQ, Visual Basic má určitou podporu XML přímo zabudovánu. Funkcionální jazyky pak mají algebraické datové typy a existují knihovny, které umožní provádět určité dotazování (např. syb a uniplate pro Haskell).

Jiří Kosek

XHTML2 narozdíl od XSLT 3.0 nemělo žádné implementace — a to je také to na čem zkrachovalo.

Proč nepoužít přímo programovací jazyk, v němž píšu celou aplikaci?

Například proto, že na výstupu transformace typicky generujete HTML nebo XML a ve všech jazycích kromě XSLT a XQuery se musí generované fragmenty HTML/XML escapovat nebo generovat pomocí příkazů typu print, nebo různých markup builderů — nejde použít nejoblíbenější návrhový vzor mnoha vývojářů (prosté copy’n’paste).

U složitějších transformací vám pak bude chybět mocný dotazovací jazyk a mechanismus automatického průchodu stromem dokumentu a výběru nejvhodnější šablony pro zpracování.

Například lispovské jazyky tu byly dříve než SGML a vcelku dobře se v nich pracuje se stromovými strukturami.

Historie ukázala, že tudy cesta nevede. Předchůdcem XSL byl jazyk DSSSL, což je Scheme s pár věcmi navíc, a i když z čistě teoretického hlediska bylo DSSSL dokonalejší než XSLT (minimálně XSLT 1.0), DSSSL se používalo a používá minimálně.

xx

ve všech jazycích kromě XSLT a XQuery se musí generované fragmenty HTML/XML escapovat nebo generovat pomocí příkazů typu print, nebo různých markup builderů

Například Visual Basic to podporuje a Scala také:
http://msdn.microsoft.com/en-us/library/ms364068%28v=vs.80%29.aspx#vb9overview_topic6
http://www.scala-lang.org/node/131

A v Haskellu je možné něco podobného realizovat pomocí Template Haskellu. Programátoři v OCamlu pak použijí camlp4.


U složitějších transformací vám pak bude chybět mocný dotazovací jazyk a mechanismus automatického průchodu stromem dokumentu a výběru nejvhodnější šablony pro zpracování.

Tohle lze vyřešit v rámci knihovny.

fos4

A misto databazich budeme pouzivat knihovni psane v jazyce v jakem je psana aplikace. Protoze tam je „neco podobneho taky mozne“.

Transformace XML -> ? je XSLT velmi jednoducha oproti jinym jazykum, nebot XSLT obsahuje XPath a dalsi funkce ktere by se v jinym jazycich museli nejak simulovat, zkuste si to…

xx

A misto databazich budeme pouzivat knihovni psane v jazyce v jakem je psana aplikace. Protoze tam je „neco podobneho taky mozne“.

Takhle bych to neřekl. Řekl bych: místo SQL budeme používat dotazy psané v jazycích, v nichž píšeme aplikaci — což už se dnes běžně děje.


Transformace XML -> ? je XSLT velmi jednoducha oproti jinym jazykum, nebot XSLT obsahuje XPath a dalsi funkce ktere by se v jinym jazycich museli nejak simulovat, zkuste si to…

Podívejte se třeba na http://msdn.microsoft.com/en-us/library/bb675178.aspx
XPath můžete normálně používat.

xx

Pár jednoduchých příkladů pro C# je v následujícím článku:

http://www.hookedonlinq.com/LINQtoSQL5MinuteOverview.ashx

Pár příkladů, co umí VB (tohle není nutně jen pro SQL):

http://msdn.microsoft.com/en-us/library/bb763068.aspx

Hlavní výhoda je, že LINQ mohu použít pro dotazy do objektů v programu (například kolekcí), do XML, do SQL a do Entit. A mohu ho použít i k transformacím.

xx

A to se vám nelíbí nebo naopak líbí?

Jaja a Paja

Objektove db. Jedna z nich dovoluje robit native poziadavky.
http://www.db4o.com/about/productinformation/db4o/

Priklad priamo z odkazu:
IList<Student> students = db.Query<Studen­t>(delegate(Stu­dent student){
return student.Age < 20
&& student.Grade == gradeA;
});

A je dostupna pe .NET aj pre Javu.

Jiří Kosek

Například Visual Basic to podporuje a Scala také:

Nechce se mi studovat gramatiku VB.NETu a Scaly, tak se zeptám — lze uvnitř XML literálu používat veškeré další jazykové konstrukce — zejména podmínky a cykly, které opět mohou generovat XML literál?

Tohle lze vyřešit v rámci knihovny.

No chtěl bych vidět knihovnu, která s rozumně použitelnou syntaxí nabídne funkce obdobné xsl:template včetně režimů, priorit a věcí jako xsl:apply-imports nebo xsl:next-match.

xx

…lze uvnitř XML literálu používat veškeré další jazykové konstrukce — zejména podmínky a cykly, které opět mohou generovat XML literál?

Ano.

No chtěl bych vidět knihovnu, která s rozumně použitelnou syntaxí nabídne funkce obdobné xsl:template

Tohle není přímo odpověď na vaši otázku, ale Scala podporuje pattern matching pro XML:

http://daily-scala.blogspot.com/2009/11/xml-matching.html

A OCamlDuce také:

http://www.cduce.org/ocaml_manual.html

fos4

Cele mne to prijde jako zbytecna debata, vy na rikate ano je to dobry ale proc to neudelat v necem jinem nebot to tam jde taky udelat.

XSLT je primo na tyto ucely vytvoreno a vyladeno a vsechny ficurky co vam dovoluje jen horko tezko zkousi dohanet ruzne knihovny v ruznych programovacich jazycich.

xx

XSLT je primo na tyto ucely vytvoreno a vyladeno a vsechny ficurky co vam dovoluje jen horko tezko zkousi dohanet ruzne knihovny v ruznych programovacich jazycich.

Pár důvodů, proč použít programovací jazyk, v němž píšu aplikaci:

  • jednoduché dotazy/transformace napíšu rychleji a bude to kratší než v XSLT
  • transformace/dotazy mohu parametrizovat celými funkcemi, třídami nebo moduly
  • k dispozici je řada knihoven, mohu se například připojit k databázi, použít složitější validační mechanismy (mj. jak se v XSLT validuje e-mail) nebo generovat data v jiném formátu (co když budu z XSLT generovat SQL dotazy, bude mi schopen XSLT procesor garantovat, že vygenerované dotazy jsou platné?)
  • nemusím se učit další jazyk
  • na určité typy zadání je XSLT a XQuery absolutně nevhodné
fos4
  • jednoduché dotazy/transformace napíšu rychleji a bude to kratší než v XSLT
    – nebude, ve valné většine XSLT vyjde lépe
  • transformace/do­tazy mohu parametrizovat celými funkcemi, třídami nebo moduly
    – XSLT ma templates, promene, parametry atd.
  • k dispozici je řada knihoven, mohu se například připojit k databázi, použít složitější validační mechanismy (mj. jak se v XSLT validuje e-mail) nebo generovat data v jiném formátu (co když budu z XSLT generovat SQL dotazy, bude mi schopen XSLT procesor garantovat, že vygenerované dotazy jsou platné?)
    – validace se da provadet na vstupnim XML – a tady je moznosti na validaci spousty, DTD, relaxNG…, mimo jine je tu i moznost volat fce daneho jazyka primo z XSLT ale to uz jina..
  • nemusím se učit další jazyk
    – to nemusis
  • na určité typy zadání je XSLT a XQuery absolutně nevhodné
    – stejně tak jako i jine jazyky
xx

nebude, ve valné většine XSLT vyjde lépe

S tou syntaxí dost těžko.

XSLT ma templates, promene, parametry

To je stále hodně daleko od toho, co nabízí vyšší programovací jazyky.

stejně tak jako i jine jazyky

Měl jsem na mysli dotazování, což jsem zapomněl uvést.

xx

Ještě k té krátkosti zápisu. Generování HTML seznamu čísel v Haskellu:

ul $ forM_ [1 .. n] (li . toHtml)

Je to z tutoriálu knihovny BlazeHtml pro generování HTML.

Opravdový odborník :-)

Ad „jak se v XSLT validuje e-mail“

Regulárním výrazem jako všude jinde. Případně si napsat vlastní rozšíření, pokud chce člověk dělat ptákoviny typu kontrola MX záznamů nebo dokonce naavzování SMTP spojení (blbost).

Opravdový odborník :-)

Ad „co když budu z XSLT generovat SQL dotazy, bude mi schopen XSLT procesor garantovat, že vygenerované dotazy jsou platné?)“

Který jazyk (kromě procedurálního/SQL jazyka daného SŘBD) ti tohle zaručí? Možná tak nějaké ORM jako je JPA.

A co se týče SQL – některé lepší DB umí vrátit výsledek ve formě XML – tam je XSL transformace ideální, člověk nemusí řešit překlad dat na objekty a zase zpátky

Ad „nemusím se učit další jazyk“

Totéž lze říct o XSLT – kdo umí HTML, ten se naučí pár řídících konstrukcí a může začít psát první transformace — naučit se úplně jiný jazyk je většinou víc práce.

Ad „na určité typy zadání je XSLT a XQuery absolutně nevhodné“

To lze říct o každém nástroji

xx

Který jazyk (kromě procedurálního/SQL jazyka daného SŘBD) ti tohle zaručí? Možná tak nějaké ORM jako je JPA.

To generování stačí zabalit do nějakého builderu, který nedovolí postavit neplatné dotazy.

To lze říct o každém nástroji

Měl jsem na mysli dotazování, zapomněl jsem to uvést. S XSLT a XQuery jste omezen na velmi úzkou množinu věcí, které tam lze rozumně udělat.

Opravdový odborník :-)

Ad „To generování stačí zabalit do nějakého builderu, který nedovolí postavit neplatné dotazy.“

Abys měl jistotu, potřebuješ ovladač/knihovnu pro konkrétní SŘBD a stejně to nestačí — abys měl jistotu, že dotazy jsou OK, potřebuješ i konkrétní datový model, nad kterým se budou pouštět. Tohle žádný „builder“ nedokáže, protože nemá dostatek informací (a nedokonalý „builder“ jde napsat i v tom XSLT)

Ad „jste omezen na velmi úzkou množinu věcí, které tam lze rozumně udělat.“

Více méně ano, ale to (relativně) úzké zaměření je výhoda oproti univerzálním nástrojům. A v oblasti dotazování je XQuery hodně silný jazyk.

xx

abys měl jistotu, že dotazy jsou OK, potřebuješ i konkrétní datový model, nad kterým se budou pouštět

Pochopitelně. Například PG’OCaml není builder, ale normálně se připojí v době kompilace k databázi a vše ověří staticky. To samé může dělat i ten builder.

Případně ten model může být k dispozici v podobě tříd, a pak už Vám LINQ může dát určité záruky v době kompilace.

Problém je, že v jazycích jako je XSLT se velmi těžko dělá nějaká abstrakce.

A v oblasti dotazování je XQuery hodně silný jazyk.

Dokud není třeba provádět složitější odvozování.

Jakub Hozak
Martin Putniorz
Pavel

použití „industrial grade“ technologií něčem „malém“.

Osobně třeba Ant nemusím, ale jinak je tandem XML/XSLT dobrý tam kde jsou data přirozeně získávána z různých zdrojů a prezentována v různych souvislostech.

Já takhle pár svých menších webů (tvorbou webů se jinak nezabývám) udržuji a naprosto mi to vyhovuje. Není třeba instalovat další frameworky, stačí xslt procesor, a v kombinaci s CSS a trochou javascriptu je to přesně co mi vyhovuje – umožňuje čisté oddělení dat od obsahu, a mix obecných patternů s lokálním ručním doladěním (x)html kódu.

Díky za popularizační článek a té, pro mne ne moc pochopitelné zášti některých „webařů“ si nevšímejte!

Pepa

No ona to není ani tak „zášť“ jako spíš podiv nad volbou technologie. Ten článek je hezkou ukázkou jak to funguje, ale zvolená technologie je asi trošku „na komára s minometem.“ Nehledě na to, že je celkem zbytečný něco takovýho psát sám.

Jiří Kosek

Samozřejmě psát si na malý web o pár stránkách „vlastní redakční systém“ v XSLT je trošku přehnané. Na druhou stranu příklady pro článek nemůžou být nějaké extra složité, pokud má mít článek rozumný rozsah a někdo ho má číst.

Pokud snad někteří z těch, co zde dříve projevili extrémní nechuť nad XSLT, mají přece jen hlavu otevřenou, možná se můžou zamyslet nad tím, jak by se v jejich oblíbených nástrojích dělaly úlohy typické pro XSLT, např.:

Mám strukturovaný dokument v nějakém XML formátu (např. DocBook) a potřebuji z něj vygenerovat statický web včetně obsahu, odkazů, číslování objektů, rejstříku, …
Něco jako http://www.kosek.cz/xml/xslt/

Mám v XML nějakou komplexní datovou strukturu (např. kompletní informace o studijním systému nějaké školy) a potřebuji z toho udělat web, něco ve stylu http://studijniplany.amu.cz/

Mám rozsáhlou kolekci článků v XML a potřebuji to dát na web, např. http://www.balisage.net/Proceedings/index.html

Řekl bych, že znám poměrně mnoho nástrojů, ale pro takovéto úlohy mi XSLT přijde jako nejvhodnější nástroj.

Nadruhou stranu chápu nechuť některých pro XSLT — v praxi jsem už viděl tolik špatných příkladů použití XSLT, kdy to psal nějaký člověk, co vůbec nepochopil základní principy jazyka. Ale to je klasický problém — když někdo používá technologii, kterou dobře neovládá, nedopadne to dobře. Ale není to chyba technologie, ale té osoby mezi klávesnicí a židlí.

Pepa

Tam je otázka, pro koho je ten článek vlastně určen.

Asi ne pro pokročilého developera s nějakou znalostí XSLT, který dělá věci co vy popisujete – ten už tyhle principy obvykle zná.

Pro méně pokročilého developera, který si chce udělat opravdu jednoduchý téměř statický web (jak se o tom píše v úvodu článku) bude ta volba XSLT asi dost nešťastná. Konec konců sám píšete „když někdo používá technologii, kterou dobře neovládá, nedopadne to dobře“.

Opravdový odborník :-)

Začít se dá s málem a učit se postupně – pokud jsem článek dobře pochopil, tak generátor je v podstatě hotový nástroj a uživatel ho může hned použít + si případně dopíše nějaké to makro nebo upraví šablonu.

Pavel

Nicméně pokud se někdo chce seznámit s xslt tak je tohle myslím docela přístupná cesta, vyzkoušet si novou technologii ve spojení s něčím co už zná jinak (tvorbou jednoduchého webu)….

Opravdový odborník :-)

Proto je to nejspíš svobodný software – aby to mohl používat i ten, kdo si to sám nenapsal, ne?

xx

Ta XSL šablona je z velké části totožná s výstupním dokumentem – ve kterém jsou sem tam značky, co se má vložit ze vstupu.

Je otázka, jestli je to výhoda.

j

Mimochodem, castecne (ne kompletni specifikaci) umi transformace primo napriklad firefox => posle se mu xml + xsl a on to aplikuje. Vyhoda toho je, ze uzivatel ma k dizpozici primo netransformovana zdrojova data a muze snimi tedy nalozit dle libosti. S vyhodnou pouzitelne napriklad pro rss – pokud prijde na stranku s rss nekdo bez ctecky, zobrazi se mu to „nejak hezky“ (pokud to jeho prohlizec umi, samozrejme), pricemz ctecka proste pouzije jen ta data a transformacni sablona ji nijak nevadi.

Naprosto idealni je to pak pro ruzne statistiky – napr hernich serveru, kde vznikaji vsemozne weby hracu, kteri si chteji na svuj web vytahnout trebas sve vysledky/informace o postavach/… nemuseji pak parsovat hnusne html, ktere se navic muze menit.

fos4

Transformaci v prohlizeci například hodne použival blizzard na svych webech.
Nevim proc, ale nyni uz to serviruje hotove.

Jiří Kosek

Podpora XSLT 1.0 v desktopových prohlížečích je dneska už celkem slušná (tj. umějí ji všechny hlavní prohlížeče). Nicméně v mobilních zařízení tomu tak není — pokud chcete, aby stránky fungovaly i tady, je potřeba ještě na serveru vyrobit HTML, které se pošle klientovi.

Problém prohlížečů je v tom, že podporují pouze XSLT 1.0. V XSLT 2.0 se přitom píše mnohem produktivněji. Nicméně už existuje implementace XSLT 2.0 v Javascriptu, takže XSLT 2.0 lze používat na mnohem širším spektru prohlížečů, viz: http://www.saxonica.com/html/ce/doc/contents.html

ptica

ukladani vetsich dat do xml dokumentu nasadili na mff lingvistice pred lety
a prineslo to podle meho tyhle nevyhody:

1] vetsi velikost souboru
2] pomale dotazovani, pametova narocnost: treba ziskat slovnikove heslo ze slovniku; tehdy neexistoval eXist, ale stejne, jak si i dneska stoji v porovnani s zaindexovanymi daty v sql?
3] xslt je v jadru pattern matching – vidim vyhody jako optimalizace na rychlost zadarmo atd, ale vsechny moje sablony jsou dneska nepouzivane, protoze se vyvojem formatu vstupnich dat je proste nikdo neumi aktualizovat, xslt sablona je z definice obtizne prepouzitelna, pokud Vam nekdo zasadne zamicha se vstupem pisete novou. xstl je snad jeste vice write-only nez perl
4] pouzit off-shelf nastroje na xml predavane socketem taky nejde, vsechny knihovny buffrujou, prijde msg a oni cekaji az se naplni buffer! ke vsemu xml data musi mit jeden root element – coz ma mozna smysl u dokumentu ale u protokolu jako jabber uz me to teda netesi.

Franta

Dnes vyšla nová verze: XML Web generátor – verze 0.4, která mj. přináší podporu skriptování.

Enum a statická analýza kódu

Mám jednu univerzální radu pro začínající programátorty. V učení sice neexistují rychlé zkratky, ovšem tuhle radu můžete snadno začít používat a zrychlit tak tempo učení. Tou tajemnou ingrediencí je statická analýza kódu. Ukážeme si to na příkladu enum.