2013-10-04 1 views
2

Я использую XSLT 1.0 для извлечения информации из инфобокс Википедии, а для некоторых ссылок - дополнительную информацию с других сайтов Википедии.Как открыть недействительный HTML (из Википедии) через document() в XSLT?

В принципе, это работает отлично, если 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, все с одинаковым результатом.

+0

Не XSLT только для XML? HTML не является XML. – svick

+0

явно проблема с википедией. вы должны опубликовать в wikipedia, а не xslt. –

+0

doctype '' - стандартное соответствие HTML-декларации, которое ставит современный браузер в «стандартном режиме». «Xhtml1-transitional.dtd» в HTML-файле будет синтаксической ошибкой, так как это XML DTD и синтаксис XML различны, –

ответ

1

Saxon и Xalan (я не знаю о xsltproc) позволяют вам предоставлять URIResolver для обработки запросов document(). Этому разрешено возвращать любой объект Source. Чтобы обработать ввод HTML, верните SAXSource, XMLReader которого на самом деле является парсером HTML. Есть несколько кандидатов, TagSoup и validator.nu - последнее, вероятно, лучше, поскольку оно утверждает, что реализует алгоритм синтаксического анализа HTML5. Процессор XSLT тогда подумает, что он имеет дело с хорошо сформированным XML.

В качестве альтернативы, в Саксоне существует функция расширения saxon:parse-html(). Это фактически использует TagSoup внизу.

+0

Да, это было. В конце концов, я использовал http://web-xslt.googlecode.com/svn/trunk/htmlparse/htmlparse.xsl как готовое решение с Saxon 9 HE (saxon: parse-html требует PE или EE). Единственный недостаток в том, что он действительно требует XSLT 2.0. Большое спасибо! – user2848343

Смежные вопросы