Mariusz S. pisze:
> mhy, przerobić zawsze można, ale myślałem, że można rozwiązać ten
> problem po stronie szablonu.
No tak. Tak byłoby najlepiej. Wtedy samo php sprowadzałoby się do
przetransformowania GET na XML i odpalenia czegoś w stylu:
xslt::transformacja('szablony/index.xsl', $xml);
> Tworzenie oddzielnych plików xsl dla każdej akcji w module moim zdaniem
> mija się z sensem.
A jednak cytujesz takie rzeczy, jak kontakt_dodaj.xsl i kontakt_lista.xsl,
ponieważ chcesz pewne rzeczy trzymać osobno. Proponuję coś takiego (mogą być
błędy, to tylko koncepcja):
kontakty_dodaj.xsl:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:import href="modul.xsl" />
<xsl:template mode="abc" match="*">
<!-- tutaj rzeczy z dodaj -->
</xsl:template>
<xsl:template match="system">
<xsl:call-template name="strona" /> <!-- ewentualnie z with-param, jeśli trzeba
-->
</xsl:template>
</xsl:stylesheet>
modul.xsl:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:import href="head.xsl" />
<xsl:import href="body.xsl" />
<xsl:template name="strona">
<html lang="pl">
<head>
<xsl:apply-templates select="." mode="Head"/>
</head>
<body>
<xsl:apply-templates select="." mode="Body"/>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
fragment body.xsl:
<!-- zamiast choose -->
<xsl:apply-templates select="." mode="abc"/>
Jednak patrząc z szerszej perspektywy, to Twoje rozwiązanie jest lepsze. Masz
na wejściu xml, w którym w zależności od pewnego elementu/atrybutu chcesz
wykonać pewne template'y. xsl:choose właśnie do tego służy i to jest poprawne
rozwiązanie. Być może chciałbyś zaimportować tylko taki akrusz, z którego
rzeczywiście skorzystasz, a nie wszystkie (kontakty_dodaj.xsl,
kontakty_lista.xsl). I to jest właśnie to coś, co ja bym rozwiązywał na poziomie
PHP. Wybór arkuszu. Ten wybór zależy od parametrów z GET, które i tak
przetwarzasz w PHP, więc wybór arkuszu niewiele tutaj miesza, a będzie
optymalizacją dla silnika XSLT, który nie będzie musiał przetwarzać tylu plików.
Ile to będzie kodu w PHP i co tracisz nie robiąc tego w XSLT?
A jeśli z jakichś innych powodów bardzo zależy Ci na tym, żeby jednak pewne
rzeczy zrobić w XSLT, a nie PHP, to szomiz podał najlepsze i najmocniejsze
rozwiązanie:
"Transformacje, przed jej wykonaniem mozesz... stransformowac ;>"
Będzie to wymagało podwójnej transformacji za każdym razem (przez to
wolniejsze), ale będziesz miał swobodę, jakiej chcesz. Oczywiście do momentu,
kiedy okaże się, że przydałoby się to 3 razy transformować:)
Podsumowując wywód: XSLT to nie Lisp. Tutaj nie można wszystkiego.