xQuery локальное имя против xPath с HTML - PullRequest
0 голосов
/ 11 марта 2010

при условии следующего html (минус комментарии и "nbsp;" и т. Д., Которые xQuery не будет обрабатывать как есть), почему следующий код работает

for $first in fn:doc("file:///index.html")//element()[local-name() = "head"]
    return <test>{ $first }</test>

и это

for $first in fn:doc("file:///index.html")//head
return 
<test>{ $first }</test>

не работает?

1 Ответ

3 голосов
/ 11 марта 2010

Поскольку index.html - это XHTML, а <head>, который вы ищете, находится в пространстве имен XHTML.

Первый запрос игнорирует пространства имен, потому что вы используете функцию local-name().

Второй запрос не выполняет, он явно запрашивает <head>, который находится в пустом пространстве имен.

Вам понадобится

declare namespace x="http://www.w3.org/1999/xhtml"

for $first in fn:doc("file:///index.html")/x:html/x:head
return <test>{ $first }</test>

Обратите внимание, что я избегаю использования //, поскольку он проходит через все дерево документа, хотя в этом случае единственно возможная позиция <head> известна заранее. Если вы сделаете это явно, то это значительно ускорит запрос XPath.

...