XSL transformace escapovaných tagů rubrika: Programování: PHP
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 <img src=""/> 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.
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.
Pro zobrazení všech 4 odpovědí se prosím přihlaste:
Nebo se přihlaste jménem a heslem:
Komentáře