В сообществе EXPath W3C есть спецификация для модуля HTTP-клиента, доступного из реализаций XPath и XQuery, который выполняет "приведение в порядок" содержимого HTML. См. http://expath.org/spec/http-client#d2e517 раздел спецификации, который описывает это:
Если тип мультимедиа является HTML-типом, содержимое очищается и анализируется (этот процесс зависит от реализации), а элемент является результирующим узлом документа.
Теперь вы можете подумать, что использовать вопрос HTTP для запроса HTML несколько обходно, но вполне естественно, что можно запросить или просмотреть документы HTML, полученные через HTTP. Это также соответствует духу независимости от процессора.
Следующий пример кода является стандартным XQuery, который будет работать на любой реализации XPath или XQuery, которая поддерживает HTTP-клиент EXPath. Он демонстрирует, как можно получить документ HTML5 (здесь, саму спецификацию HTML5, чьи незамкнутые теги, такие как <meta>
делают его не правильно сформированным XML), и запросить его с помощью выражения XPath:
xquery version "3.1";
declare namespace html = "http://www.w3.org/1999/xhtml";
import module namespace http = "http://expath.org/ns/http-client";
let $url := "https://www.w3.org/TR/html5/"
return
if (doc-available($url)) then
"The URL was well-formed XML. No tidying required. :)"
else
let $response := http:send-request(<http:request href="{$url}" method="GET"/>)
let $response-head := $response[1]
let $response-body := $response[2]
return
if (
$response-head/http:body/@media-type eq "text/html"
and $response-body instance of document-node()
) then
"The URL was an HTML document that was tidied into a "
|| "well-formed XML document. :) For example: "
|| $response-body//html:meta => head() => serialize()
else
"The HTTP Client wasn't able to parse the result "
|| "into a well-formed XML document. :("
Возвращает:
The URL was an HTML document that was tidied into a well-formed XML document. :)
For example:
<html:meta
xmlns:html="http://www.w3.org/1999/xhtml"
http-equiv="Content-Type"
content="text/html; charset=utf-8"/>
Обратите внимание, что этот элемент <meta>
является правильно сформированным XML и был создан выражением XPath //html:meta
. (Я проверял это в eXist. Тот же код работает в BaseX, за исключением того, что выражение //meta
, поскольку BaseX не приводит приведенный в порядок HTML-код в пространство имен HTML, как eXist.)
Я должен добавить, что спецификация HTTP Client оставляет процессорам возможность определять «порядок», поэтому, безусловно, будут различия между реализациями, но если вопрос «Могут ли XPath и XQuery работать с документами HTML?», это демонстрирует, что они могут, и они могут делать это только с независимыми от процессора спецификациями - с оговоркой, доказанной здесь, что разные реализации могут интерпретировать спецификацию по-разному.