我正在使用 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>
而不是“复制”元素,我使用这个:
<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.