【发布时间】:2010-11-30 12:06:58
【问题描述】:
如何插入
 
进入 XSLT 样式表,我不断收到此错误:
XML 解析错误:未定义的实体
基本上我想要在 XSLT 模板中使用不间断的空格字符。
【问题讨论】:
-
你也可以使用 与 相同看这里stackoverflow.com/questions/7511214/…
标签: xslt
如何插入
 
进入 XSLT 样式表,我不断收到此错误:
XML 解析错误:未定义的实体
基本上我想要在 XSLT 模板中使用不间断的空格字符。
【问题讨论】:
标签: xslt
你也可以使用:
<xsl:value-of select=" "/>
【讨论】:
&amp;nbsp;(假设您打算在此处使用分号),它将呈现为&nbsp;,而不是` `(nb-space)。
虽然@brabster 和其他人已经提供了答案。
我认为更可重用的解决方案是:
<xsl:variable name="space"> </xsl:variable>
...
<xsl:value-of select="$space"/>
【讨论】:
请改用实体代码&#160;。
&nbsp; 是一个 HTML“字符实体引用”。 XML 中没有用于不间断空格的命名实体,因此您使用代码&#160;。
Wikipedia includes a list of XML and HTML entities,您可以看到 XML 中只有 5 个“预定义实体”,但 HTML 有超过 200 个。我还会指出 Creating a space ( ) in XSL 有很好的答案。
【讨论】:
&#x160; 而不是 &#160;,后者将始终解析为 Unicode 不间断空格。
尝试使用
<xsl:text> </xsl:text>
但这取决于您使用的 XSLT 处理器:XSLT 规范不要求 XSLT 处理器将其转换为“&nbsp;”。
【讨论】:
XSLT 样式表必须是格式正确的 XML。由于"&nbsp;" 不是the five predefined XML entities 之一,它不能直接包含在样式表中。
因此,回到您的解决方案 "&#160;" 是您应该使用的 "&nbsp;" 的完美替代品。
例子:
<xsl:value-of select="$txtFName"/> <xsl:value-of select="$txtLName"/>
【讨论】:
使用这个
<xsl:text disable-output-escaping="yes">&</xsl:text>nbsp;
编辑:反对者可能应该首先验证这是否有效(它确实有效,并且是该问题的最通用解决方案。)
【讨论】:
我试图在 HTML 表格的空单元格上显示边框。我在空单元格中使用不间断空间的旧技巧不适用于 xslt。我使用了具有相同效果的换行符。我提到这一点是为了以防您尝试使用不间断空间的原因是为“空”表格单元格提供一些内容以打开单元格边框。
<br/>
【讨论】:
当您使用以下内容(不带disable-output-escaping!)时,您将获得一个不间断的空格:
<xsl:text>&#160;</xsl:text>
【讨论】:
disable-output-escaping
&#160; 效果很好。但是,它将以 ANSI 编码显示那些奇怪的字符之一。 <xsl:text> 最适合我。
<xsl:text> </xsl:text>
【讨论】:
除了victor hugo's answer 之外,还可以在 XSLT 文件中获取所有已知的合法字符引用,如下所示:
<!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>& –</xsl:text>
与<xsl:text disable-output-escaping="yes">相比,这种方法的结果也有一定的差异。后者将为各种输出生成字符串文字,例如&nbsp;,即使是<xsl:output method="text">,这可能与您可能希望的不同......相反,获取为XSLT模板定义的实体通过<!DOCTYPE ... <!ENTITY ... 将始终产生与您的 xsl:output 设置一致的输出。
当包含所有字符引用时,最好使用本地实体解析器来阻止 XSLT 引擎从 Internet 获取字符实体定义。 JAXP 或明确的 Xalan-J 用户可能需要 Xalan-J 的补丁才能正确使用解析器。有关补丁下载和 cmets,请参阅我的博客 XSLT, entities, Java, Xalan...。
【讨论】:
也可以这样做:
<xsl:text disable-output-escaping="yes"><![CDATA[ ]]></xsl:text>
【讨论】:
disable-output-escaping,这将起作用,这不是必需的,它在 XSLT 2.0 中已被弃用,在 3.0 中更是如此。在这些版本中,您可以通过保证跨处理器工作的xsl:character-map 达到相同的效果。此外,这会在输出中放置一个命名实体&nbsp;,它不一定与不间断空格相同,并且接收端必须声明此实体(在 HTML 中它通常是隐式的)。
您可能希望在文件开头添加此实体的定义(在 xml 声明下方):
<!DOCTYPE stylesheet [
<!ENTITY nbsp " " >
]>
您还可以添加更多实体,例如 Ntilde、Aacute 等。
【讨论】: