如何插入  在XSLT中


207

我该如何插入

 

进入XSLT样式表,我不断收到此错误:

XML解析错误:未定义实体

本质上,我希望XSLT模板中包含不间断的空格字符。


2
您也可以使用  与 相同 看看这里stackoverflow.com/questions/7511214/...
user3766111

Answers:


336

请改用实体代码 

 是HTML“字符实体参考”。XML中没有用于不间断空格的命名实体,因此您使用代码 

Wikipedia包含XML和HTML实体的列表,您可以看到XML中只有5个“预定义的实体”,但是HTML有200多个。我还将指向在XSL中创建一个空格( ),其中极好的答案。


3
最近,我们遇到一种情况,其中许多XSL中只有一个停止使用此技术,并开始显示一个奇怪的字符。但是,如果我使用WaterSoul的CDATA技术,它将起作用。

@BrianReindel,这可能意味着您使用了错误的数字实体引用,即Š代替 ,后者将始终解析为Unicode不间断空格。
亚伯2015年

十大Java和XSLT技巧链接非常有用。
LCJ

<xsl:text>&#160; </ xsl:text>它分隔了两个字段
Manash Ranjan Dakua

1
链接已烂。
GSerg '18年

37

&#160;真的很好 但是,它将以ANSI编码显示这些奇怪的字符之一。<xsl:text>最适合我

<xsl:text> </xsl:text>

3
使用公认的答案,我最终在XML输出中换行了(至少在VS2010的XML编辑器中是这样)。使用这个答案,我只能得到1个空格。
Mathijs Flietstra 2014年

1
@Matthijs,这是一个空间,不是一个不间断的空间,这是不一样的。如果VS显示不正确,请检查您的编码(VS完全能够正确显示此编码,它应该独立于编码,因此更有可能您做错了其他事情)。
亚伯

25

一个人也可以这样做:

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

2
如果处理器支持disable-output-escaping,则不需要使用XSLT 2.0中已弃用的处理器(在3.0中更是如此),这将起作用。在这些版本中,可以xsl:character-map保证跨处理器工作,从而达到相同的效果。同样,这会将一个命名实体&nbsp;放置在输出中,该实体不必与不间断空格相同,并且接收端必须声明该实体(在HTML中通常是隐式的)。
亚伯(Abel)2015年

21

用这个

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

编辑:投票者可能应该首先验证它是否起作用(它确实起作用,并且是对该问题的最一般的解决方案。)


1
不确定,但是我已经测试了我的方法,并且可以用,所以我不确定是什么原因:(
jagprinderdeep

2
同样,根据链接的页面,接受的答案对所有解析器都无效;只是抬起头
jagprinderdeep 09/09/22

1
我之前已经给出过拒绝的理由,但是如果我要否决这个答案,那么原因就是-它回答了错误的问题。OP明确询问了如何使用xslt放置不易碎的空间,并且您回答了如何放置&符-nbsp-分号序列。争执唐纳德也是不好的。但是说真的,您是否从未对CDATA这么说过?
Michael Krelin-黑客

1
好的,jagprinderdeep,我撤回了我的反对票,但作为回报,一旦我遭到精神庇护,请去拜访我。(请注意,由于这个新原因,我不会退票)。但是请务必理解您回答了错误的问题。我认为,这恰恰是另一次失败的原因。
Michael Krelin-黑客

8
由于您不能保证接收端会声明&nbsp ;,因此我也投了反对票。如果您使用的是xslt + html,那么可以,尽管有hack,但这也是一种方法。但是,如果您正在使用xslt生成其他xml,那么它只会对您造成伤害。
道格

14

您可能想要在文件的开头(在xml声明下方)添加此实体的定义:

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

您还可以添加更多实体,例如Ntilde,Aacute等。


5

除了victor hugo的答案之外,还可以使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>&amp; &nbsp; &ndash;</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补丁才能正确使用解析器。请参阅我的博客XSLT,entity,Java,Xalan ...了解补丁下载和评论。


1
请注意,最近,如果来自自动化过程,W3开始阻止对那些链接和类似链接的太多请求。将该文件放在本地或您的服务器上,并相应地调整URL,就可以了。除此之外,+ 1和使用HTML命名实体的出色解决方案。
亚伯(Abel)2015年

一个很好的说明,还有另一个具有实体定义的文件本地副本的原因,否则,如果没有Internet连接,则XSLT进程很可能会失败。在Java世界中,无需黑客入侵URL,因为可以安排EntityResolver,而Apache XML Commons Resolver可能是不错的选择。其他编程平台也可能也有类似的技术……
Sergey Ushakov

是的,对于dotnetters来说,仅供参考:用于实体的ResolveEntity抽象方法用于加载外部资源的XmlResolver (这些Java方法.NET等效项)
亚伯2015年

2

使用以下命令(不带disable-output-escaping!)时,您将获得一个不间断的空格:

<xsl:text>&#160;</xsl:text>


4
你不需要disable-output-escaping为这个
伊恩·罗伯茨

2

XSLT样式表必须是格式正确的XML。由于"&nbsp;"不是五个预定义XML实体之一,因此不能将其直接包含在样式表中。因此,回到您的解决方案"&#160;""&nbsp;"您应该使用的完美替代品。

例:

<xsl:value-of select="$txtFName"/>&#160;<xsl:value-of select="$txtLName"/>


0

我试图在HTML表格的空白单元格上显示边框。我在空单元格中使用不间断空间的旧技巧在xslt上无效。我使用换行符具有相同的效果。我提到这一点是为了以防您尝试使用不间断空间的原因是为“空”表单元格提供一些内容以打开单元格边界。

<br/>

我也有类似的情况,这似乎可以使表格单元格呈现出来。
理查德·摩尔

0

尝试使用

<xsl:text>&#160;</xsl:text>

但这取决于您使用的XSLT处理器:XSLT规范不需要XSLT处理器将其转换为“ &nbsp;”。


0

尽管@brabster和其他人已经提供了答案。
我认为更可重用的解决方案是:

<xsl:variable name="space">&#160;</xsl:variable>
...
<xsl:value-of select="$space"/>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.