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. The first Direct Debit payment will be collected along with other payments that are already due 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.The
和 dueon
。
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="€" string="&euro;"/>
<xsl:output-character character=" " string="&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-map
、xsl:preserve-space
、更改编码.. 但没有任何效果。
唯一有效的方法是将 [<!ENTITY nbsp " ">]
声明添加到 INPUT html 中的 DOCTYPE,但我不想为了添加这一点而在流程中创建额外的步骤。
请帮忙。我应该添加什么才能让 XSL/Saxon 停止忽略
?
DTD 感知 XML 解析器要求声明文档引用的实体。 XSLT 处理需要扩展实体引用,因此符合标准的 XSLT 处理器通常在其前端使用符合标准的 DTD 感知 XML 解析器。如果您继续提供使用未声明实体的处理输入,那么您将继续获得不满意的结果。
如果输入已经包含引用适当 DTD 的文档类型声明,那么您应该尝试使用支持 DTD 的解析器。如果没有,您可以注入这样的文档类型声明,或者您可以通过 Tidy 或一些类似的处理器 运行 HTML,它采用 HTML DTD 并扩展所有实体引用。
我有一个 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. The first Direct Debit payment will be collected along with other payments that are already due 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.The
和 dueon
。
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="€" string="&euro;"/>
<xsl:output-character character=" " string="&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-map
、xsl:preserve-space
、更改编码.. 但没有任何效果。
唯一有效的方法是将 [<!ENTITY nbsp " ">]
声明添加到 INPUT html 中的 DOCTYPE,但我不想为了添加这一点而在流程中创建额外的步骤。
请帮忙。我应该添加什么才能让 XSL/Saxon 停止忽略
?
DTD 感知 XML 解析器要求声明文档引用的实体。 XSLT 处理需要扩展实体引用,因此符合标准的 XSLT 处理器通常在其前端使用符合标准的 DTD 感知 XML 解析器。如果您继续提供使用未声明实体的处理输入,那么您将继续获得不满意的结果。
如果输入已经包含引用适当 DTD 的文档类型声明,那么您应该尝试使用支持 DTD 的解析器。如果没有,您可以注入这样的文档类型声明,或者您可以通过 Tidy 或一些类似的处理器 运行 HTML,它采用 HTML DTD 并扩展所有实体引用。