XSLTを使用して
、XMLファイルから特殊文字(など)を含むHTMLコンテンツを抽出しています。コンテンツは<content>
ノードに保存されます。私は次のようなほとんどの特殊文字を定義しました:<!ENTITY nbsp " ">
、したがって、この式は完全にうまく機能します:
<xsl:copy-of select="content" disable-output-escaping="yes"/>
target="_blank"
ここで、そのコンテンツ内にあるすべてのリンクに追加したいと思います。これは私が思いついた解決策です:
<xsl:template match="a" mode="html">
<a>
<xsl:attribute name="href"><xsl:value-of select="@*"/></xsl:attribute>
<xsl:attribute name="target">_blank</xsl:attribute>
<xsl:apply-templates select="text()|* "/>
</a>
</xsl:template>
そして、「copy-of」要素の代わりに、これを使用します。
<xsl:apply-templates select="content" mode="html"/>
これで、これらの特殊文字(およびnbspも)がすべて出力から消えました。どうすればそれらを保持できますか?disable-output-escaping="yes"
ここでは役に立たないようです。
わかりました。PHPでXSLTProcessorクラスを使用しています。属性は実際にはエラーを出しませんでしたdisable-output-escaping
が、それを削除したとき、出力はすべてのnbspで同じだったので、問題ではありませんでした。
UPD。前に示したXSLテンプレートを使用して、入力サンプルは次のようになります。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE page SYSTEM "html-entities.xsl">
<content>There is a non-breaking <a href="http://localhost">space</a> inside.</content>
html-entities.xsl:
<?xml version="1.0" encoding="UTF-8"?>
<!ENTITY nbsp " ">
PHPコード:
$xp = new XSLTProcessor();
$xsl = new DOMDocument();
$xsl->load($xsl_filename);
$xp->importStylesheet($xsl);
$xml_doc = new DOMDocument();
$xml_doc->resolveExternals = true;
$xml_doc->load($xml_filename);
$html = $xp->transformToXML($xml_doc);
私の現在の出力:
There is anon-breaking <a href="http://localhost" target="_blank">space</a> inside.
私の希望する出力:
There is a non-breaking <a href="http://localhost" target="_blank">space</a> inside.