Могу ли я проанализировать HTML с помощью XSLT? - PullRequest
3 голосов
/ 28 октября 2009

Мне нужно разобрать большой HTML-файл, и меня интересует только небольшой раздел (таблица). Поэтому я подумал об использовании XSLT для упрощения / преобразования HTML во что-то более простое, что я мог бы затем легко обработать.

У меня проблема в том, что я не могу найти мой стол. Поэтому я не знаю, возможно ли вообще анализировать HTML с помощью таблицы стилей XSL.

Кстати, HTML-файл выглядит так (схема, отсутствующие теги):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html id="ctl00_htmlDocumento" xmlns="http://www.w3.org/1999/xhtml" lang="es-ES" xml:lang="es-ES">
<div> some content </div>
<div class="NON_IMPORTANT"></div>
<div class="IMPORTANT_FATHER>
    <div class="IMPORTANT">
        <table>
            HERE IS THE DATA IM LOOKING FOR
        </table>
    </div>
</div>

согласно запросу, вот мой xsl

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="tbody">
        tbody found, lets process it
    <xsl:for-each select="tr">
        new tf found, lets process it
    </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>

Полный HTML довольно большой, поэтому я не знаю, как представить его здесь ... Я проверил действительный документ на Oxygen, и он говорит, что он действителен.

Заранее спасибо. Gonso

Ответы [ 3 ]

5 голосов
/ 28 октября 2009

Вы неправильно используете XPath в атрибутах match. Вам нужен атрибут xmlns:xhtml="http://www.w3.org/1999/xhtml" в вашем элементе xsl:stylesheet, а затем вам нужно будет использовать префикс xhtml: в выражениях XPath (вам нужен префикс; XPath не подчиняется пространствам имен по умолчанию).

После этого у вас все еще будет проблема, что он будет обрабатывать все остальное тоже. Я не знаю, есть ли лучшее решение для этого, но я думаю, что вам нужно будет явно обрабатывать вещи на пути к элементу tbody, что-то вроде

<xsl:template match="xhtml:html">
  <xsl:apply-templates select="xhtml:body"/>
</xsl:template>

и то же самое для body и так далее, пока не дойдете до вашего tbody матча.

XPath также поддерживает более сложное сопоставление, чем просто конкретный дочерний элемент, как указано выше. Например, сопоставить третий дочерний тег div можно с помощью

<xsl:template match="xhtml:div[3]">

и сопоставление элемента с определенным атрибутом с

<xsl:template match="xhtml:div[@class='IMPORTANT']">

Здесь [] окружает дополнительное условие, которое должно быть выполнено, чтобы элемент считался совпадающим. Простое число означает индексирование в совпадениях и выборку только той, которая имеет этот индекс (индексирование основано на 1), знак @ предшествует атрибуту, но у вас может быть произвольно сложный XPath, поэтому вы можете сопоставить практически любая субструктура, которую вы хотите.

4 голосов
/ 28 октября 2009

Пока ваш XHTML-документ правильно сформирован , синтаксический анализатор XML сможет его читать, и, следовательно, механизм XSLT сможет его преобразовать.

Предполагая, что наиболее распространенные причины невозможности найти элементы в документе:

  • Ваше выражение XPath выполняется относительно другого узла, который, как вы думали, будет. Что это значит для вашего XSLT - убедитесь, что ваши шаблоны соответствия XSLT верны относительно их шаблонов.
  • Вы не определили сопоставления URI-префикса пространства имен в вашем движке XPath. Что это значит для вашего XSLT - убедитесь, что у вас есть пространство имен xmlns="http://www.w3.org/1999/xhtml", объявленное в вашем файле XSLT, с префиксом или без него.

Если вы опубликуете свой XSLT, я смогу прокомментировать.

2 голосов
/ 28 октября 2009

Вы можете использовать XSLT для манипулирования HTML, предполагая, что HTML хорошо отформатирован (так как в HTML-документе это правильно сформированный XML-документ в самом строгом смысле).

Если вы можете подтвердить это, и ваш XSLT не работает, возможно, вам следует предоставить более подробный фрагмент документов HTML и XSLT, чтобы мы могли это выяснить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...