2

我使用 XSLT 1.0 从 Wikipedia infoboxes 中提取信息,并且对于某些链接,从更多 Wikipedia 站点获取附加信息。

原则上,这可以正常工作,除非为 Wikipedia 页面返回的 HTML 无效。不幸的是,这发生在所有页面上,例如俄罗斯维基百科。试试下面的例子

<xsl:for-each 
     select="document('http://ru.wikipedia.org/wiki/%D0%91%D0%B0%D0%B4%D0%B5%D0%BD_%D0%BA%D1%83%D0%BB%D1%8C%D1%82%D1%83%D1%80%D0%B0')//text()">
   <xsl:value-of select="."/>
</xsl:for-each>    

问题是实体 ® 在这个语言版本的每个页面上都使用了,但没有声明:维基百科页面的 HTML 声明被削弱了。

<!DOCTYPE html>

而不是,说,

<!DOCTYPE html SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

这显然是一个 Wikipedia 问题,而不是 XSLT 问题,但是是否有任何解决方法来解析这些站点?任何指向更健壮的 XSLT 解析器的指针?有没有办法在解析之前将实体声明注入 HTML 中?

到目前为止,我尝试了 XSLTproc、Saxon6.5.5、Saxon-B 9.1.0.8 和 Xalan,结果都一样。

4

1 回答 1

1

Saxon 和 Xalan(我不知道 xsltproc)允许您提供一个 URIResolver 来处理 document() 请求。这允许返回任何 Source 对象。要处理 HTML 输入,请返回一个 SAXSource,它的 XMLReader 实际上是一个 HTML 解析器。有几个候选者,TagSoupvalidator.nu - 后者可能更好,因为它声称实现了 HTML5 解析算法。然后 XSLT 处理器将认为它正在处理格式良好的 XML。

或者,在 Saxon 中有一个saxon:parse-html()扩展函数。这实际上在下面使用了 TagSoup。

于 2013-10-05T07:54:53.773 回答