首页 文章

如何改造 在XSLT中

提问于
浏览
5

我有一个以下xslt:

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

改造后我得到:

<span>&amp;nbsp;Some text</span>

它被渲染为:&nbsp;一些文字

我想渲染&nbsp;作为空间角色 . 我也尝试过将disable-output-escaping改为no,但它没有帮助 .

感谢帮助 .

3 回答

  • 1

    我认为你应该使用 &#xa0; ,因为 &nbsp; 实体很可能没有被定义 . 而且没有CDATA .

    还有一种可能性是为xsl文件定义 nbsp 实体:

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE xsl:stylesheet [
     <!ENTITY nbsp "&#xa0;">
    ]>
    <xsl:stylesheet version="1.0" …
    
  • 6

    另外两个答案是正确的,但我决定对这个问题采取更广泛的看法 .

    每个人都应该了解CDATA部分

    CDATA section is just an alternative serialization form to an escaped XML string. 这意味着解析器为 <span><![CDATA[ a & b < 2 ]]></span><span> a &amp; b &lt; 2 </span> 生成相同的结果 . XML应用程序处理解析的数据,因此XML应用程序应为两个示例输入元素生成相同的输出 .

    Briefly: escaped data and un-escaped data inside a CDATA section mean exactly the same.

    在这种情况下

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

    是完全相同的

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

    请注意, & 字符已在后一个序列化形式中转义为 &amp; .

    每个人都应该了解禁用 - 输出 - 转义

    disable-output-escaping is a feature that concerns the serialization only. 为了保持序列化XML的良好格式,XSLT处理器通过使用实体来逃避 &< (以及可能的其他字符) . 他们逃脱的表格是 &amp;&lt; . 是否转义,XML数据是相同的 . XSLT元素 <xsl:value-of><xsl:text> 可以具有 disable-output-escaping 属性,但通常建议避免使用此功能 . 原因是:

    • XSLT处理器可能只生成一个结果树,该结果树被传递给另一个进程而不在进程之间进行序列化 . 在这种情况下 disabling output escaping will fail 因为XSLT处理器无法控制结果树的序列化 .

    • XSLT处理器不需要支持 disable-output-escaping 属性 . 在这种情况下,处理器必须转义输出(或者它可能引发错误),所以再次, disabling output escaping will fail .

    • XSLT处理器必须转义在用于文档输出的编码中无法表示的字符 . 在这些字符上使用 disable-output-escaping 将导致错误或转义文本,所以再次, disabling output escaping will fail .

    • 禁用输出转义很容易导致格式错误或XML无效,因此使用它需要非常关注或使用非XML工具对输出进行后期处理 .

    • disable-output-escaping 经常被误解和误用,并且可以通过更常规的方式实现相同的结果,例如创建新元素作为文字或 <xsl:element> .

    在这种情况下

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

    应该输出

    <span>&nbsp;Some text</span>
    

    但是 & 字符反而被转义了,所以在这种情况下输出转义似乎失败了 .

    每个人都应该了解使用实体的内容

    If an XML document contains an entity reference, the entity must be declared ,如果没有,则该文件无效 . XML只有5个预定义的实体 . 他们是:

    • &amp; for &

    • &lt; for <

    • &gt; for >

    • &quot; for "

    • &apos; for '

    所有其他实体引用必须在文档的内部DTD中定义,或者在文档引用的外部DTD中定义(直接或间接) . 因此,盲目地向XML文档添加实体引用可能会导致文档无效 . 具有(X)HTML DOCTYPE的文档可以使用多个实体(如 &nbsp; ),因为XHTML DTD指的是包含其定义的DTD . 实体在这三个DTD中定义:http://www.w3.org/TR/html4/HTMLlat1.enthttp://www.w3.org/TR/html4/HTMLsymbol.enthttp://www.w3.org/TR/html4/HTMLspecial.ent .

    实体引用并不总是被替换文本替换 . 例如,如果解析器没有网络连接来检索DTD,则可能发生这种情况 . 非验证解析器也不需要包含替换文本 . 在这种情况下,实体代表的数据是"lost" . 如果实体获得替换工作,则解析数据模型中将没有迹象表明XML序列化完全具有任何实体引用 . 如果使用实体或其替换值,则数据模型将相同 . Briefly: entities are only an alternative way to represent the replacement text of the entity reference.

    在这种情况下, &nbsp; 的替换文本是 &#160; (与使用十六进制表示法的 &#xA0; 相同) . 而不是尝试输出 &nbsp; 实体,只使用@phihag建议的解决方案将更容易,更健壮 . 如果您喜欢 &nbsp; 实体的可读性,可以遵循@Michael Krelin建议的解决方案,并在内部DTD中定义该实体 . 之后,您可以直接在XSLT代码中使用它 .

    请注意,在这两种情况下,XSLT处理器 will output the literal non-breaking space character 而不是 &nbsp; 实体引用或 &#160; 字符引用 . 使用XSLT 1.0手动创建此类引用需要使用 disable-output-escaping 功能,如上所述,它有自己的问题 .

  • 4

    在CDATA中,所有值都是字面值 . 你要:

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

相关问题