提问人:Diego Schiavon 提问时间:7/1/2022 最后编辑:Diego Schiavon 更新时间:7/4/2022 访问量:222
如何在 XSLT 中处理 HTML 实体
How to process HTML entities in XSLT
问:
我正在尝试转换包含该实体的XHTML。Saxon 抱怨该实体没有定义。如何定义它?
是否可以在样式表的开头添加实体定义?按照建议 此处:http://s-n-ushakov.blogspot.com/2011/09/xslt-entities-java-xalan.html 或此处:在 XSLT 中使用 HTML 实体(例如 )
我的微不足道的尝试被撒克逊人忽略了,是在 XSLT 的开头添加以下内容:
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE stylesheet [
<!ENTITY nbsp " ">
]>
我正在使用 Saxon 9.9 PE。 我尝试转换的 HTML 是一个完整的文档,而不仅仅是一个片段。
答:
一种可能性是将 XHTML 的 URL 作为参数传递给 XSLT,XSLT 将使用该函数将 XHTML 读取为文本,使用该函数展开实体引用,并使用该函数分析结果。例如unparsed-text()
replace()
parse-xml()
<xsl:template name="xsl:initial-template">
<xsl:param name="source"/>
<xsl:apply-templates select="
$source
=> unparsed-text()
=> replace('&nbsp;', '&#x000A0;')
=> parse-xml()
"/>
</xsl:template>
评论
如果输入文档包含未在 DOCTYPE 声明中声明的实体引用,则它不是格式正确的 XML 文档,因此它不是格式正确的 XHTML 文档;如果它的格式不好,那么撒克逊人就无法处理它。
最好查看生成此格式错误的文档的处理工作流并对其进行修复,以便其生成的文档格式正确。
如果你不能这样做,那么你可以把它解析为 HTML。撒克逊语具有扩展功能;或者,如果您的应用程序是 Java 语言,则可以创建一个用作其 XMLReader 的 SAXSource。saxon:parse-html()
validator.nu
您应该考虑使用工具Tidy并将html文件转换为xhtml。它纠正了所有这些事情。
只需使用参数 -asxml 运行 tidy。
评论
<!ENTITY>
saxon:parse-html
text/html
application/xhtml+xml