我正在使用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"/>
现在所有特殊字符(包括空格)都消失了,我该如何保留它们?似乎
disable-output-escaping="yes"
也没用。好的,我在PHP中使用XSLTProcessor类。实际上
disable-output-escaping
属性没有报错,但是当我将其删除时,输出结果相同,包含所有空格,所以这个属性并不重要。
更新。使用我之前展示的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);
我的当前输出:
里面有一个非断行 <a href="http://localhost" target="_blank">空格</a>。
我期望的输出:
里面有一个 非断行 <a href="http://localhost" target="_blank">空格</a>。