【问题标题】:How to insert   in XSLT如何在 XSLT 中插入
【发布时间】:2010-11-30 12:06:58
【问题描述】:

如何插入

 

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

XML 解析错误:未定义的实体

基本上我想要在 XSLT 模板中使用不间断的空格字符。

【问题讨论】:

标签: xslt


【解决方案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 等。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-10-22
          • 2014-06-06
          • 1970-01-01
          • 2012-08-20
          • 2010-11-03
          • 2012-09-20
          • 1970-01-01
          • 2020-07-20
          相关资源
          最近更新 更多