在XSLT中包含html实体的最佳方法是什么?
<xsl:template match="/a/node">
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
</xsl:template>
这个返回 XsltParseError
答案 0 :(得分:116)
您可以使用CDATA部分
<xsl:text disable-output-escaping="yes"><![CDATA[ ]]></xsl:text>
或者您可以在本地DTD中描述&nbsp;
<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp " "> ]>
或仅使用 
代替
答案 1 :(得分:23)
也可以从aku's answer的第2部分扩展该方法,并获得所有已知的字符引用,如下所示:
<!DOCTYPE stylesheet [
<!ENTITY % w3centities-f PUBLIC "-//W3C//ENTITIES Combined Set//EN//XML"
"http://www.w3.org/2003/entities/2007/w3centities-f.ent">
%w3centities-f;
]>
...
<xsl:text> −30°</xsl:text>
与<xsl:text disable-output-escaping="yes">
方法相比,结果存在一定差异。后者将为所有类型的输出产生类似
的字符串文字,即使对于<xsl:output method="text">
也是如此,这可能恰好与您希望的不同......相反,获取实体通过<!DOCTYPE ... <!ENTITY ...
为XSLT模板定义的输出始终会产生与xsl:output
设置一致的输出。
然后使用本地实体解析器来保持XSLT引擎不从Internet获取字符实体定义可能是明智之举。 JAXP或显式Xalan-J用户可能需要Xalan-J的补丁才能正确使用解析器。有关修补程序下载和评论,请参阅我的博客XSLT, entities, Java, Xalan...。
答案 2 :(得分:14)
在xslt中使用html实体的另一种可能性是:
<xsl:text disable-output-escaping="yes">&nbsp;</xsl:text>
答案 3 :(得分:6)
默认情况下,XSLT仅处理五个基本实体:lt
,gt
,apos
,quot
和amp
。所有其他人都需要定义为@Aku提及。
答案 4 :(得分:5)
这个返回 XsltParseError
是的,原因是
不是XML或XSLT中的预定义实体,因为它是HTML格式。
您可以使用
代表的unicode字符: 
答案 5 :(得分:5)
现在有了Unicode,使用命名字符实体通常会产生反效果。出于这个原因,我建议将Unicode字符用于非中断空间而不是实体。或者,您可以使用实体 
;而不是命名实体。使用命名实体使您的XML依赖于内联或外部DTD。
答案 6 :(得分:1)
我发现所有这些解决方案都在空白处产生了一个字符。
使用<xsl:text> </xsl:text>
解决了我的问题;但是<xsl:text>#x20;</xsl:text>
可能也会有用。
答案 7 :(得分:0)
感谢您提供的信息。我写了一篇简短的博客文章,基于对我有用的内容,因为我在Dynamicweb CMS的模板中进行了XSLT转换。
博文在这里:How to add entities to XSLT templates。
/ Sten Hougaard
答案 8 :(得分:0)
必须使用实体#x160;
答案 9 :(得分:0)
我对Aku的DOCTYPE方法没有运气。
在Windows 2003服务器上进行MSXML转换时对我有用的是
<xsl:text disable-output-escaping="yes">&#160;</xsl:text>
上述混合的排序。感谢Stackoverflow贡献者!
答案 10 :(得分:-3)
文本标签之间的一个空格字符就足够了。