XSLT 在转换期间忽略

XSLT ignoring   during transformation

我有一个 HTML 文件,我用 XSL 将其转换为另一个 HTML 文件(只是调整其结构,使其在大多数电子邮件客户端中看起来不错)。

HTML 是从其他系统接收的,我无法修改此 HTML 的生成方式。


我的问题是内部包含   的标签。 XSL 转换忽略它。

HTML 输入:

<span style="font-family: 'HelveticaNeue LT 45 Lt', serif; font-size: 12px; color:#000000">
  IMPORTANT: The loan is repayable by 10 payments.&nbsp;The first Direct Debit payment will be collected&nbsp;along with other payments that are already due&nbsp;on...
</span>

HTML 输出:

<p class="bodytext" align="justify" style="font-size:14px; font-weight:200; font-align:justify;">
  IMPORTANT: The loan is repayable by 10 payments.The first Direct Debit payment will be collectedalong with any other payments that are already dueon...
</p>

两个空格都丢失了,文本被连接起来:payments.Thedueon


XSL 有点复杂。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:character-map name="escape">    
  <xsl:output-character character="&#128;" string="&amp;euro;"/>    
  <xsl:output-character character="&#160;" string="&amp;nbsp;"/>
</xsl:character-map>
<xsl:output method="html" indent="yes" use-character-maps="escape"/>
<xsl:template match="body">
 <html>        
   <head>
    <meta name="generator" content="HTML EMail optimization by" />          
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
...

...
<xsl:template name="TextTemplate">
 <xsl:if test="not(starts-with(.,'XSLTButton'))">
  <xsl:value-of select="text()"/>          
 </xsl:if>
</xsl:template>

我正在使用 Saxon 9.1.0.8

谷歌搜索后,我尝试使用 xsl:character-mapxsl:preserve-space、更改编码.. 但没有任何效果。

唯一有效的方法是将 [<!ENTITY nbsp "&#160;">] 声明添加到 INPUT html 中的 DOCTYPE,但我不想为了添加这一点而在流程中创建额外的步骤。

请帮忙。我应该添加什么才能让 XSL/Saxon 停止忽略 &nbsp;

DTD 感知 XML 解析器要求声明文档引用的实体。 XSLT 处理需要扩展实体引用,因此符合标准的 XSLT 处理器通常在其前端使用符合标准的 DTD 感知 XML 解析器。如果您继续提供使用未声明实体的处理输入,那么您将继续获得不满意的结果。

如果输入已经包含引用适当 DTD 的文档类型声明,那么您应该尝试使用支持 DTD 的解析器。如果没有,您可以注入这样的文档类型声明,或者您可以通过 Tidy 或一些类似的处理器 运行 HTML,它采用 HTML DTD 并扩展所有实体引用。