在XSLT中使用HTML实体(例如)

时间:2008-08-28 08:55:35

标签: xslt

在XSLT中包含html实体的最佳方法是什么?

<xsl:template match="/a/node">
    <xsl:value-of select="."/>
    <xsl:text>&nbsp;</xsl:text>
</xsl:template>

这个返回 XsltParseError

11 个答案:

答案 0 :(得分:116)

您可以使用CDATA部分

<xsl:text disable-output-escaping="yes"><![CDATA[&nbsp;]]></xsl:text>

或者您可以在本地DTD中描述&nbsp;

<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp "&#160;"> ]>

或仅使用&#160;代替&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>&nbsp;&minus;30&deg;</xsl:text>

<xsl:text disable-output-escaping="yes">方法相比,结果存在一定差异。后者将为所有类型的输出产生类似&nbsp;的字符串文字,即使对于<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">&amp;nbsp;</xsl:text>

答案 3 :(得分:6)

默认情况下,XSLT仅处理五个基本实体:ltgtaposquotamp。所有其他人都需要定义为@Aku提及。

答案 4 :(得分:5)

  

这个返回 XsltParseError

是的,原因是&nbsp;不是XML或XSLT中的预定义实体,因为它是HTML格式。

您可以使用&nbsp;代表的unicode字符:&#160;

答案 5 :(得分:5)

现在有了Unicode,使用命名字符实体通常会产生反效果。出于这个原因,我建议将Unicode字符用于非中断空间而不是实体。或者,您可以使用实体&#160;而不是命名实体。使用命名实体使您的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">&amp;#160;</xsl:text>

上述混合的排序。感谢Stackoverflow贡献者!

答案 10 :(得分:-3)

          

文本标签之间的一个空格字符就足够了。