XSLT在转换期间忽略

时间:2017-09-21 16:32:19

标签: html xml xslt saxon

我有一个HTML文件,我将其与XSL一起转换为另一个HTML文件(仅调整其结构,以便在大多数电子邮件客户端中看起来很好)。

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

我的问题是内部包含XCUIElementsInTheBottomOrTableFooterView.tap() XCTAssert(XCUIElementsInTheBottomOrTableFooterView.isHittable, "message") 的标签。 XSL转换忽略了它。

HTML输入:

 

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>

两个空格都缺失,文字连接在一起:<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

XSL有点复杂。

dueon

我正在使用Saxon 9.1.0.8

经过一些谷歌搜索后,我尝试使用<?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> xsl:character-map,更改编码......但没有任何效果。

唯一有效的方法是在INPUT html中向DOCTYPE添加xsl:preserve-space声明,但我不想在此过程中创建额外的步骤来添加此位。

请帮忙。我应该添加什么,以便XSL / Saxon停止忽略[<!ENTITY nbsp "&#160;">]

1 个答案:

答案 0 :(得分:2)

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

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