XSL transformace escapovaných tagů rubrika: Programování: PHP

5 podhy
položil/-a 22.6.2012

Zdravím,
řeším problém jak přiřadit tagům , které jsou ve vstupním dokumentu escapované (jsou ve formátu <img src=""/>) třídu na základě určité podmínky.

V podstatě mám tento vstupní XML dokument:
<?xml version="1.0" encoding="UTF-8"?>
<dokument>
<obsah>text &lt;img src=""/&gt; dalši text</obsah>
</dokument>

A potřebuji aby výsledné XML/HTML bylo ve tvaru <p>text <img class="test" src="...."/> další text</p>

V podstatě bych potřeboval aby se <xsl:apply-templates/> dalo spouštět s parametrem disable-output-escaping. Je něco takového vůbec možné v XSL? V současné době to mám řešené tak, že se provedou dvě nezávislé transformace, ale byl bych rád kdyby se to dalo dát pouze do jednoho souboru.

Stačila by mě alespoň ukázka jak nahradit libovolný takto escapovaný tag třeba nějakým textem. Se zbytkem bych se popral. Předem děkuji za rady.

odkaz
5 podhy
odpověděl/-a 25.6.2012
 
upravil/-a 25.6.2012

Takže děkuji Jiřímu Koskovi za radu s využitím vlastní PHP funkce. Zde přikládám řešení.

XSL šablona:

<?xml version="1.0" encoding="UTF-8"?>
 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
    xmlns:php="http://php.net/xsl"
    exclude-result-prefixes="php">
    <xsl:output method="html"/>
 
    <xsl:template match="//obsah">
        <p>
            <xsl:apply-templates select="php:functionString('xsl_parse_html', text())" mode="doe"/>
        </p>
    </xsl:template>
 
 
    <xsl:template match="//img" mode="doe">
        test
    </xsl:template>
 
</xsl:stylesheet>

A ještě PHP funkce vytvářející nový dokument:

function xsl_parse_html($string)
{   
    $dom = new DOMDocument('1.0', 'UTF-8');
    $dom->loadHTML("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" . $string);
 
    $dom->removeChild($dom->firstChild);    
    $dom->removeChild($dom->firstChild);
 
    $fragment = $dom->createDocumentFragment();
    $nodes = $dom->firstChild->firstChild->firstChild->childNodes;
    while ($nodes->length > 0)
    {
        $fragment->appendChild($nodes->item(0));
    }
 
    $dom->replaceChild($fragment, $dom->firstChild);
 
    return $dom;
}

XSLT preprocesor je potřeba spustit se zaregistrovanými PHP funkcemi.

Komentáře

  • podhy : Takže ještě jsem upravil tu PHP funkci. Snad se to bude někomu hodit. 25.6.2012

Pro zobrazení všech 4 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.