保持和XSLT输出等特殊字符应用模板(Keep   and other special charac

2019-07-31 21:41发布

我使用XSLT来提取一些HTML内容包含特殊字符(如&nbsp;从XML文件。 所述内容被存储在<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.

Answer 1:

输入XML文档的源代码基本上是否具有类似字符引用&#160; 或相似的实体引用&nbsp; 或这样的性格字面上没关系XSLT并且不有所作为输入如何被处理和输出的外观; 基本XSLT对存储在文本节点Unicode字符的树工作。 至少,这是理论,你的PHP代码似乎有可能存储实体引用节点,但即便如此,对于XSLT是不应该的问题DOM树模型的工作。 在输入树应该包含Unicode字符的文本节点(一个,如果其可以是使用Unicode 160的不间断空格字符),如果你这样的文本复制到输出结果树具有相同的Unicode字符的文本节点。

对于输出方法html一些XSLT处理器(撒克逊6.5.5实例)可能会做你的青睐,以确保定义为HTML实体字符序列与相应的实体引用,但即使他们不这样做的结果的系列化树应与适当的Unicode字符,所指示的编码的文件encoding的的属性xsl:output元件。

您当前的结果是完全下降的字符(例如, There is anon-breaking )没有道理给我。



文章来源: Keep   and other special characters in XSLT output with apply-templates