65

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

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

这个返回一个XsltParseError

4

11 回答 11

123

您可以使用 CDATA 部分

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

或者您可以在本地 DTD 中描述  :

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

或者只是使用&#160;而不是&nbsp;

于 2008-08-28T09:02:13.060 回答
24

也可以从aku 答案的第二部分扩展该方法并获得所有已知的可用字符引用,如下所示:

<!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;用于各种输出,甚至 for <xsl:output method="text">,这可能与您可能希望的不同......相反,获取为 XSLT 模板定义的实体<!DOCTYPE ... <!ENTITY ...将始终产生一致的输出与您的xsl:output设置。

明智的做法是使用本地实体解析器来阻止 XSLT 引擎从 Internet 获取字符实体定义。JAXP 或明确的 Xalan-J 用户可能需要 Xalan-J 的补丁才能正确使用解析器。有关补丁下载和评论,请参阅我的博客XSLT、实体、Java、Xalan...。

于 2011-09-30T17:36:43.117 回答
15

在 xslt 中使用 html 实体的另一种可能性是:

<xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
于 2008-08-28T09:10:04.133 回答
6

这个返回一个XsltParseError

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

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

于 2008-08-28T09:04:39.700 回答
6

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

于 2008-08-28T09:13:45.090 回答
5

现在有了 Unicode,使用命名字符实体通常会适得其反。出于这个原因,我建议将 Unicode 字符用于不间断空格而不是实体。或者,您可以使用实体&#160;,而不是命名实体。使用命名实体会使您的 XML 依赖于内联或外部 DTD。

于 2008-08-28T12:59:00.603 回答
1

我发现所有这些解决方案都在空白处产生了一个字符。

使用<xsl:text> </xsl:text>为我解决了问题;但<xsl:text>#x20;</xsl:text>也可以工作。

于 2012-01-24T20:03:28.800 回答
0

感谢您的信息。当我在Dynamicweb CMS的模板中进行 XSLT 转换时,我已经根据对我有用的方法写了一篇简短的博客文章。

博客文章在这里:如何将实体添加到 XSLT 模板

/Sten Hougaard

于 2012-01-18T13:05:24.493 回答
0

必须使用实体 #x160;

于 2012-05-25T08:44:31.127 回答
0

我对 Aku 的 DOCTYPE 方法不满意。

在 Windows 2003 服务器上的 MSXML 转换中对我有用的是

    <xsl:text disable-output-escaping="yes">&amp;#160;</xsl:text>

有点像上述的混合体。感谢 Stackoverflow 的贡献者!

于 2013-01-27T01:41:34.277 回答
-3

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

于 2011-07-02T21:27:32.370 回答