如何在 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="&#160;"/>

【讨论】:

这将输出&amp;amp;nbsp;(假设您打算在此处使用分号),它将呈现为&amp;nbsp;,而不是` `(nb-space)。【参考方案2】:

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

<xsl:variable name="space">&#160;</xsl:variable>
...
<xsl:value-of select="$space"/>

【讨论】:

【参考方案3】:

请改用实体代码&amp;#160;

&amp;nbsp; 是一个 html“字符实体引用”。 XML 中没有用于不间断空格的命名实体,因此您使用代码&amp;#160;

Wikipedia includes a list of XML and HTML entities,您可以看到 XML 中只有 5 个“预定义实体”,但 HTML 有超过 200 个。我还会指出 Creating a space (&nbsp;) in XSL 有很好的答案。

【讨论】:

我们最近遇到了一种情况,其中只有一个 XSL 停止使用这种技术,并开始显示一个奇怪的字符。但是,如果我使用 WaterSoul 的 CDATA 技术,它就可以工作。 @BrianReindel,这可能意味着您使用了错误的数字实体引用,即 &amp;#x160; 而不是 &amp;#160;,后者将始终解析为 Unicode 不间断空格。 链接Top Ten Java and XSLT Tips真的很有用。   它将两个字段分开 链接已失效。【参考方案4】:

尝试使用

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

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

【讨论】:

【参考方案5】:

XSLT 样式表必须是格式正确的 XML。由于"&amp;nbsp;" 不是the five predefined XML entities 之一,它不能直接包含在样式表中。 因此,回到您的解决方案 "&amp;#160;" 是您应该使用的 "&amp;nbsp;" 的完美替代品。

例子:

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

【讨论】:

【参考方案6】:

使用这个

<xsl:text disable-output-escaping="yes">&amp;</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!)时,您将获得一个不间断的空格:

&lt;xsl:text&gt;&amp;#160;&lt;/xsl:text&gt;

【讨论】:

这个不需要disable-output-escaping【参考方案9】:

&amp;#160; 效果很好。但是,它将以 ANSI 编码显示那些奇怪的字符之一。 &lt;xsl:text&gt; 最适合我。

<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>&amp; &nbsp; &ndash;</xsl:text>

&lt;xsl:text disable-output-escaping="yes"&gt;相比,这种方法的结果也有一定的差异。后者将为各种输出生成字符串文字,例如&amp;nbsp;,即使是&lt;xsl:output method="text"&gt;,这可能与您可能希望的不同......相反,获取为XSLT模板定义的实体通过&lt;!DOCTYPE ... &lt;!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[&nbsp;]]></xsl:text>

【讨论】:

如果处理器支持disable-output-escaping,这将起作用,这不是必需的,它在 XSLT 2.0 中已被弃用,在 3.0 中更是如此。在这些版本中,您可以通过保证跨处理器工作的xsl:character-map 达到相同的效果。此外,这会在输出中放置一个命名实体&amp;nbsp;,它不一定与不间断空格相同,并且接收端必须声明此实体(在 HTML 中它通常是隐式的)。【参考方案12】:

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

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

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

【讨论】:

以上是关于如何在 XSLT 中插入的主要内容,如果未能解决你的问题,请参考以下文章

如何在 XSLT 表中显示正确的内容

如何使用 XSLT 替换命名空间中的元素?

如何使用xslt插入/替换元素

带有文本输出的 XSLT 空白控件

如何将数据 RSS 插入数据库

XSLT 可以插入当前日期吗?