XSL transformace XSL šablony rubrika: Programování: Jiné

3 Fos4
položil/-a 5.8.2020
 
upravil/-a 5.8.2020

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

odkaz Vyřešeno
Anonym
odpověděl/-a 6.8.2020

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>

Komentáře

  • Fos4 : Určitě by to takto taky šlo..taky mně napadlo, ale tuto možnost jsem vyloučil, protože: - slovník může být poměrně velký (velké XML, pomalá tranformace...) - nelze si šablonu před vygenerovat a mít ji v cache (pokaždé bude transformace i na slovník) - budu mixovat xsl pro data z aplikace a pro překlady (což mně osobně vadí, nepůjde pak dobře dohledat co se ze slovníku používá, zda není někde chyba) - rád bych měl data z aplikace a data ze slovníku oddělené (jak v XML) tak v XSL 6.8.2020
  • Anonym : Tak my sme bezne posielali do XSLT aj 100MB XMLka a fungovalo to, taky velky slovnik asi mat nebudete. 6.8.2020
  • Fos4 : Jo, to jsem hledal... díky :) 10.8.2020

Pro zobrazení všech 2 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.