如何在 XSLT 中处理 HTML 实体

How to process HTML entities in XSLT

提问人:Diego Schiavon 提问时间:7/1/2022 最后编辑:Diego Schiavon 更新时间:7/4/2022 访问量:222

问:

我正在尝试转换包含该实体的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  "&#x000A0;">
]>

我正在使用 Saxon 9.9 PE。 我尝试转换的 HTML 是一个完整的文档,而不仅仅是一个片段。

xslt xhtml 撒克逊语

评论

3赞 Heiko Theißen 7/1/2022
我假设,您必须将定义包含在 XHTML 源代码中,而不是包含在样式表中。<!ENTITY>
0赞 Martin Honnen 7/1/2022
撒克逊语的哪个版本?XHTML输入是完整的文档还是片段?
0赞 Diego Schiavon 7/2/2022
请参阅上面的编辑。输入是一个完整的 HTML 文档,我使用的是 Saxon 9.9 PE。我希望除了包括<之外还有其他方法!ENTITY>定义到源,但如果这是更直接的方法,我会尝试。
0赞 Martin Honnen 7/2/2022
使用实体引用的完整、格式正确的 XHTML 文档,例如应该声明一个 XHTML DOCTYPE,该 XHTML DOCTYPE 引用声明实体的 XHTML DTD。&nbsp;
0赞 Martin Honnen 7/2/2022
请注意,使用 PE,您可以访问 Saxon 扩展函数,例如(不确定我是否记得正确的名称),这应该可以解析 HTML,尽管 as 而不是 as .但是肯定支持 HTML 的实体。saxon:parse-htmltext/htmlapplication/xhtml+xml

答:

1赞 Conal Tuohy 7/2/2022 #1

一种可能性是将 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('&amp;nbsp;', '&amp;#x000A0;')
         => parse-xml()
   "/>
</xsl:template>

评论

0赞 Conal Tuohy 7/4/2022
...但正如其他人所指出的那样,该文档的格式不正确,如果可能的话,您应该找到问题的根源并在那里修复它。
1赞 Michael Kay 7/3/2022 #2

如果输入文档包含未在 DOCTYPE 声明中声明的实体引用,则它不是格式正确的 XML 文档,因此它不是格式正确的 XHTML 文档;如果它的格式不好,那么撒克逊人就无法处理它。&nbsp;

最好查看生成此格式错误的文档的处理工作流并对其进行修复,以便其生成的文档格式正确。

如果你不能这样做,那么你可以把它解析为 HTML。撒克逊语具有扩展功能;或者,如果您的应用程序是 Java 语言,则可以创建一个用作其 XMLReader 的 SAXSource。saxon:parse-html()validator.nu

1赞 habrewning 7/4/2022 #3

您应该考虑使用工具Tidy并将html文件转换为xhtml。它纠正了所有这些事情。

只需使用参数 -asxml 运行 tidy。