XSL transformace XSL šablony rubrika: Programování: Jiné
Ahoj, potřeboval bych poradit s XSLT transformací... Řeším jazykové překlady v XSL šablonách a přemýšlím nad šablonou a nějak se nemohu dostat k výsledku....
Moje myšlenka je:
- vytvořím XML pro každý jazyk
- do současných XSL šablon webu přidám značky
- vytvořím XSLT šablonou pro nahrazení značek. Ta vezme webovou XSL šablonu, natáhne si přes documnet() slovník a nahradí znaky za hodnotu
- uložím nově vygenerovanou XSLT šablonu a tu budu používat (dokud nebude potřeba ji znovu vygenerovat).
Rád bych využil, aby ty "moje značky lng" se v této nové šabloně vyhodnotili stejně, jako běžné XSL a ostatní se ignorovalo, takže abych mohl použít třeba <lng:for-each select="days/day"><lng:value-of select="text()" /></lng:for-each">
Slovník vypadá nějak takto :
<?xml version="1.0" encoding="UTF-8"?> <language> <title>Nadpisv CS</title> </language>
Pak mám klasickou šablonu stránky, kde jsem si přidal značku (namespace lng) - ta nahradila pevné texty v šabloně:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:lng="http://example.com/XSLT/lng" > <xsl:output method="xml" version="1.0" encoding="utf-8" /> <xsl:template match="/"> <h1> <!-- TOTO potřebuji nahradit v další šabloně za hodnotu ze slovniku --> <lng:value-of select="language/title" /> </h1> <xsl:for-each select="products/node"> <div><xsl:value-of select="name" /></div> </xsl:for-each> </xsl:template> </xsl:stylesheet>
Nyní potřebuji vytvořit XSLT šablonu, která vezme šablonu výše a vytvoří novou šalonu s tím, že nahradí za hodnotu "language/title" ze slovniku, vse ostatni zustava stejné...
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl" xmlns:f="http://gigacomputer.cz/functions" extension-element-prefixes="php f" exclude-result-prefixes="php f" > <xsl:output method="xml" version="1.0" encoding="utf-8" /> <!-- $dictionaryFile je doplněno přes PHP setParameter (<a href="https://www.php.net/manual/en/xsltprocessor.setparameter.php" title="https://www.php.net/manual/en/xsltprocessor.setparameter.php">https://www.php.net/manual/en/xsltprocessor.setparameter.php</a>) --> <xsl:variable name="dictionary" select="document($dictionaryFile)" /> <!-- tady tápu..vstupní XML pro transformaci je šablona webu.. --> </xsl:stylesheet>
Mohl bych to celé obejít a vyřešit v PHP, s XML se dobře pracuje a jsem schopen si to vše nahradit, ale říkám si, proč to duplikovat, když XSLT všechno co potřebuji již umí.. jen moc nevím jak na to..
PS: mohl bych do šablony stránky rovnou posílat slovník, ale ten bude poměrně velký a zaroven si chci zachovat pripadnou kontrolu preklepu (zkontrolovat vystupni sablonu ze treba neobsahuje uz zdany a ze se vse opravdu nahradilo)
Děkuji všem
A nebolo by jednoduchsie spojit tie datove subory s prekladom a udajmi do jedneho suboru a pouzivat vsade xsl:value-of. Takze vstupne xml by vyzeralo nejako takto:
<docWithTrans> <trans> <title>Moj titutol</title> </trans> <doc> ... original doc </doc> </docWithTrans>
Takze po pripomienke mozno takto (neda sa dat formatovany kod do komentara). V principe riesenie je nieco taketo, prepacte nemam cas to ladit ale:
<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:dyn="http://exslt.org/dynamic"> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <xsl:template match="lng:value-of"> <xsl:copy> <xsl:text><xsl:value-of select="dyn:evaluate(./@select)" /></xsl:text> </xsl:copy> </xsl:template> </xsl:stylesheet>
Pro zobrazení všech 2 odpovědí se prosím přihlaste:
Nebo se přihlaste jménem a heslem:
Komentáře