XSLT transformace je proces, v němž je XML dokument podle zapsaných pravidel překonvertován do jiného tvaru - nejčastěji XML v jiném formátu nebo HTML k prezentaci. Ve většíně případů, kdy se XSLT transformace využívá k prezentaci dat uživateli, se na různá data aplikuje vždy ta samá šablona. Někdy je ale potřebné, nebo minimálně užitečné, kromě těchto dvou vstupů dodat ještě něco dalšího.

V XSLT můžete pomocí elementu xsl:param definovat parametry, které lze "zvenčí" (při přípravě transformace) naplnit vhodnou hodnotou. Zpravidla se jedná o číslo či řetězec, ale můžete - což možnosti užití výrazně rozšiřuje - tímto způsobem předat i jiný XML dokument, potažmo jeho část. Parametr se chová jako XSLT proměnná (a stejně se používá), jenom je dostupný i zvenčí.

Jednoduchý příklad použití XSLT parametru

Mějmež následující šablonu:

<?xml version="1.0" encoding="UTF-8" ?>
<x:stylesheet version="1.0" xmlns:x="http://www.w3.org/1999/XSL/Transform">
  <x:param name="SimpleParameter" />
  <x:template match="/">
    <h1>
      <x:value-of select="$SimpleParameter" />
    </h1>
  </x:template>
</x:stylesheet>

Naplnění parametru SimpleParameter hodnotou jest provésti pomocí vlastnosti TransformArgumentList použité transformace. V příkladu níže transformaci provádím pomocí server control asp:xml jménem Xml1, ale postup je analogický pro všechny transformace:

Me.Xml1.TransformArgumentList = New System.Xml.Xsl.XsltArgumentList
Me.Xml1.TransformArgumentList.AddParam("SimpleParameter", "", "Hodnota parametru")

Příklad XML souboru neuvádím, v tomto případě na něm nezáleží (použijte třeba <root />).

Předání XML struktury

Jak již bylo řečeno, hodnotou parametu může být i NodeSet, tedy vybrané nody z dokumentu. V tomto příkladu budeme chtít předat celý jednoduchý dokument:

Dim Doc As New System.Xml.XmlDocument
Doc.LoadXml("<root><demo>jedna</demo><demo>dva</demo></root>")

Me.Xml1.TransformArgumentList = New System.Xml.Xsl.XsltArgumentList
Me.Xml1.TransformArgumentList.AddParam("AdvancedParameter", "", _
                                       Doc.CreateNavigator().Select("/"))

S takto předaným parametrem je pak v šabloně možno nakládat stejně, jako s fragmentem vlastního dokumentu, příkladně:

<?xml version="1.0" encoding="UTF-8" ?>
<x:stylesheet version="1.0" xmlns:x="http://www.w3.org/1999/XSL/Transform">
  <x:param name="AdvancedParameter" />
  <x:template match="/">
    <x:for-each select="$AdvancedParameter/root/demo">
      <div>
        <x:value-of select="." />
      </div>
    </x:for-each>
  </x:template>
</x:stylesheet>