如何在 XSLT 中插入
Posted
技术标签:
【中文标题】如何在 XSLT 中插入【英文标题】:How to insert in XSLT 【发布时间】:2010-11-30 12:06:58 【问题描述】:如何插入
 
进入 XSLT 样式表,我不断收到此错误:
XML 解析错误:未定义的实体
基本上我想要在 XSLT 模板中使用不间断的空格字符。
【问题讨论】:
你也可以使用 与 相同看这里***.com/questions/7511214/… 【参考方案1】:你也可以使用:
<xsl:value-of select=" "/>
【讨论】:
这将输出&amp;nbsp;
(假设您打算在此处使用分号),它将呈现为&nbsp;
,而不是` `(nb-space)。【参考方案2】:
虽然@brabster 和其他人已经提供了答案。 我认为更可重用的解决方案是:
<xsl:variable name="space"> </xsl:variable>
...
<xsl:value-of select="$space"/>
【讨论】:
【参考方案3】:请改用实体代码&#160;
。
&nbsp;
是一个 html“字符实体引用”。 XML 中没有用于不间断空格的命名实体,因此您使用代码&#160;
。
Wikipedia includes a list of XML and HTML entities,您可以看到 XML 中只有 5 个“预定义实体”,但 HTML 有超过 200 个。我还会指出 Creating a space ( ) in XSL 有很好的答案。
【讨论】:
我们最近遇到了一种情况,其中只有一个 XSL 停止使用这种技术,并开始显示一个奇怪的字符。但是,如果我使用 WaterSoul 的 CDATA 技术,它就可以工作。 @BrianReindel,这可能意味着您使用了错误的数字实体引用,即&#x160;
而不是 &#160;
,后者将始终解析为 Unicode 不间断空格。
链接Top Ten Java and XSLT Tips真的很有用。
尝试使用
<xsl:text> </xsl:text>
但这取决于您使用的 XSLT 处理器:XSLT 规范不要求 XSLT 处理器将其转换为“&nbsp;
”。
【讨论】:
【参考方案5】:XSLT 样式表必须是格式正确的 XML。由于"&nbsp;"
不是the five predefined XML entities 之一,它不能直接包含在样式表中。
因此,回到您的解决方案 "&#160;"
是您应该使用的 "&nbsp;"
的完美替代品。
例子:
<xsl:value-of select="$txtFName"/> <xsl:value-of select="$txtLName"/>
【讨论】:
【参考方案6】:使用这个
<xsl:text disable-output-escaping="yes">&</xsl:text>nbsp;
编辑:反对者可能应该首先验证这是否有效(它确实有效,并且是该问题的最通用解决方案。)
【讨论】:
不确定,但我已经测试了我的方法并且它有效,所以我不确定反对票是为了什么:( 此外,根据链接页面,接受的答案对所有解析器都无效;只是提醒 我之前已经给出了拒绝投票的原因,但如果我要拒绝 this 答案,那么原因是 - 它回答了错误的问题。 OP 清楚地询问了如何使用 xslt 放置不可破坏的空间,您回答了如何放置 &n-b-s-p-分号序列。为反对票而争吵也是不愉快的。但说真的,你从来没有说过 CDATA 吗? 好的,jagprinderdeep,我撤销我的反对票,但作为回报,一旦我进入精神病院,请去拜访我。 (请注意,我不会因为这个新原因给你反对票)。但请理解您回答了错误的问题。我认为这正是另一次投票背后的原因。 我也投了反对票,因为你不能保证接收端会声明 。如果您正在使用 xslt+html,那么是的,这是一种方法,尽管是一种 hack。但是,如果您使用 xslt 来生成其他 xml,那么它只会对您造成影响。【参考方案7】:我试图在 HTML 表格的空单元格上显示边框。我在空单元格中使用不间断空间的旧技巧不适用于 xslt。我使用了具有相同效果的换行符。我提到这一点是为了以防您尝试使用不间断空间的原因是为“空”表格单元格提供一些内容以打开单元格边框。
<br/>
【讨论】:
我有一个类似的场景,这似乎可以让表格单元格呈现。【参考方案8】:当您使用以下内容(不带disable-output-escaping
!)时,您将获得一个不间断的空格:
<xsl:text>&#160;</xsl:text>
【讨论】:
这个不需要disable-output-escaping
【参考方案9】:
&#160;
效果很好。但是,它将以 ANSI 编码显示那些奇怪的字符之一。 <xsl:text>
最适合我。
<xsl:text> </xsl:text>
【讨论】:
使用接受的答案,我最终在我的 XML 输出中出现了换行符(至少在 VS2010 的 XML 编辑器中是这样的)。使用这个答案,我只得到 1 个空格。 @Matthijs,这是一个空格,而不是一个不间断的空格,这是不一样的。如果 VS 显示不正确,请检查您的编码(VS 完全能够正确显示此内容,并且它应该是独立于编码的,因此您更有可能做错了其他事情)。【参考方案10】:除了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...。
【讨论】:
请注意,最近,如果来自自动化流程,W3 开始阻止对这些和类似链接的过多请求。将该文件放在本地或您的服务器上并相应地调整 URL,您应该没问题。除此之外,+1 以及使用 HTML 命名实体的出色解决方案。 请注意,还有另一个原因是拥有带有实体定义的文件的本地副本,否则如果 Internet 连接不可用,XSLT 进程可能会失败。在 Java 世界中,没有必要破解 URL,因为可以安排 EntityResolver,而 Apache XML Commons Resolver 可能是一个不错的选择。其他编程平台也可能有类似的技术...... 是的,所以作为参考,对于 dotnetters:ResolveEntity abstract method 用于实体和 XmlResolver to load external resources,它们是 .NET equivalents for these Java methods。【参考方案11】:也可以这样做:
<xsl:text disable-output-escaping="yes"><![CDATA[ ]]></xsl:text>
【讨论】:
如果处理器支持disable-output-escaping
,这将起作用,这不是必需的,它在 XSLT 2.0 中已被弃用,在 3.0 中更是如此。在这些版本中,您可以通过保证跨处理器工作的xsl:character-map
达到相同的效果。此外,这会在输出中放置一个命名实体&nbsp;
,它不一定与不间断空格相同,并且接收端必须声明此实体(在 HTML 中它通常是隐式的)。【参考方案12】:
您可能希望在文件开头添加此实体的定义(在 xml 声明下方):
<!DOCTYPE stylesheet [
<!ENTITY nbsp " " >
]>
您还可以添加更多实体,例如 Ntilde、Aacute 等。
【讨论】:
以上是关于如何在 XSLT 中插入的主要内容,如果未能解决你的问题,请参考以下文章