W serwisie http://9fingers.pl/ padło ciekawe pytanie dotyczące wyjęcia ścieżki elementu z atrybutu w dokumencie i użycia jej jako wskazania miejsca z którego mają być pobrane dane dla wyjście. Zawiłe? Pokażmy to na przykładzie. Poniżej kod dokumentu przetwarzanego:[geshifilter-code language="XML"]<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="style.xsl"?>
<page>
<pre>fragment kodu
</pre>
<file name="index.xml" sec="/page/pre"/>
</page>
[/geshifilter-code]Poniżej kod arkusza wzorca translacji, jaki chciało by się zastosować:[geshifilter-code language="XSLT"]<xsl:stylesheet version = '1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:template match="/*">
<xsl:variable name="vwhat" select="/page/file/@sec/." />
<xsl:copy-of select="$vwhat" />
</xsl:template>
</xsl:stylesheet>[/geshifilter-code]ale to nie działa! Domyślnie XSLT 1.0 nie ewaluuje ścieżki zawartej w zmiennej [geshifilter-code]$vwhat[/geshifilter-code] jako selektora, tylko jako tekst do wyświetlenia. Na swój sposób jest to logiczne i spójne z ideą działania zmiennych. Ale intuicja każe to właśnie w ten sposób zrobić.
Dłubiąc w poszukiwaniu rozwiązania po internecie, wpadłem na Pytanie na bytes.com na pytanie dotyczące, czegoś bardzo podobnego. Skierowało mnie ono do strony Rozszerzenia XSLT z rozszerzeniami do XSLT, gdzie istnieje moduł dynamic - jego rolą jest dynamiczna ewaluacja napisów zawierających ścieżki XPath.
W przykładzie będzie to wyglądać następująco:[geshifilter-code language="XSLT"]<xsl:stylesheet version = '1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
xmlns:dyn="http://exslt.org/dynamic" extension-element-prefixes="dyn">
<xsl:template match="/*">
<xsl:variable name="vwhat" select="/page/file/@sec/." />
<xsl:copy-of select="dyn:evaluate($vwhat)" />
</xsl:template>
</xsl:stylesheet>[/geshifilter-code]Taki przykład, działa już zgodnie z oczekiwaniami.
Wadą rozwiązania, jest ograniczona ilość procesorów XSLT, która wpiera te rozszerzenia. Jakieś zmiany w tej materii miały miejsce w XSLT 2.0, ale szczegóły nie są jeszcze dla mnie jasne.