4

我正在使用 XSLT&nbsp;从 XML 文件中提取一些带有特殊字符(如 )的 HTML 内容。内容存储在<content>节点中。我已经定义了像这样的大多数特殊字符:<!ENTITY nbsp "&#160;">,所以这个表达式工作得很好:

<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&nbsp;non-breaking <a href="http://localhost">space</a> inside.</content>

html-entities.xsl:

<?xml version="1.0" encoding="UTF-8"?>
<!ENTITY nbsp "&#160;">

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&nbsp;non-breaking <a href="http://localhost" target="_blank">space</a> inside.

4

1 回答 1

0

基本上,输入 XML 文档的源代码是否具有类似字符引用&#160;或类似实体引用&nbsp;或这样的字符对于 XSLT 而言并不重要,并且不会影响输入的处理方式和输出的外观;基本上,XSLT 在一个树上运行,Unicode 字符存储在文本节点中。至少理论上是这样,您的 PHP 代码似乎可以与 DOM 树模型一起使用,该模型可能存储实体引用节点,但即便如此,对于 XSLT 来说也无关紧要。在输入树中应该有包含 Unicode 字符的文本节点(如果可能是 Unicode 160 的不间断空格字符),如果将这样的文本复制到输出,则结果树有一个文本节点具有相同的 Unicode 字符.

对于输出方法,html一些 XSLT 处理器(例如 Saxon 6.5.5)可能会帮助您确保在 HTML 中定义为实体的字符使用相应的实体引用进行序列化,但即使它们不这样做,结果树的序列化应该是具有正确 Unicode 字符的文件,按照元素encoding属性的指示进行编码。xsl:output

您当前完全放弃角色(例如There is anon-breaking)的结果对我来说没有意义。

于 2012-09-26T12:04:30.340 回答