В вашем вопросе довольно много путаницы, и ее нелегко разрешить, не написав полное руководство по пространствам имен XML.Я постараюсь рассказать как можно лучше о том, как они соотносятся с (X) HTML.
Во-первых, целью пространств имен является разделение словарей.Так, например, элемент title
в пространстве имен http://www.w3.org/1999/xhtml
можно отличить от элемента title
в пространстве имен http://www.w3.org/2000/svg
, когда они появляются в одном документе или обрабатываются общим процессором.
Во-вторых, забудьте о пространстве имен http://www.w3.org/2000/xmlns/
.То, что он делает, в значительной степени скрыто, и вам редко приходится об этом беспокоиться.
Далее необходимо различать пустое пространство имен, пространство имен по умолчанию и пространства имен, на которые ссылаются префиксы.
Когда в XML-файле не определены атрибуты xmlns=
, все нефиксированные элементы называются «в нулевом пространстве имен» или «в отсутствие пространства имен», что равносильно одной вещи.
Когда элемент XMLимеет атрибут xmlns=
, он и его дочерние элементы, если они не имеют префикса, называются «в пространстве имен по умолчанию», где пространством имен по умолчанию является значение атрибута xmlns.
Префиксные элементы всегда находятся впространство имен, отображаемое с помощью xmlns:prefix=
атрибутов в элементе или предке элемента.
Теперь словарь XHTML определен как элементы в пространстве имен http://www.w3.org/1999/xhtml
, поэтому в правильно написанном документе XHTML будет объявлено либо это пространство именкак пространство имен по умолчанию или преобразует префикс в пространство имен, в этом случае весь XHTЭлементы ML должны будут включать этот префикс в свои имена.(Последняя ситуация случается не очень часто по причинам, указанным ниже).
Таким образом, при синтаксическом анализе XHTML с помощью синтаксического анализатора XML требуется сопоставление пространства имен.
Однако XPathне имеет понятия пространства имен по умолчанию.Если вы не добавите префикс к элементам, указанным в xpath, он попытается сопоставить элементы в пустом пространстве имен.Если элементы XHTML находятся в пространстве имен http://www.w3.org/1999/xhtml
, то xpath не будет ничего совпадать.
Здесь все становится сложнее - браузеры.
Если вы обслуживаетеВеб-страницы XHTML для браузеров, как вам следует, с типом содержимого XML, таким как application / xhtml + xml, браузер будет использовать для его загрузки анализатор XML, и все вышеперечисленные правила применяются.Если вы не включите атрибут xmlns="http://www.w3.org/1999/xhtml"
, браузеры не поймут, как его обрабатывать, и просто отобразят файл в виде необработанной XML-структуры.
Однако, поскольку IE до IE9 не поддерживал XMLТипы контента, вряд ли кто-то обслуживает свои веб-страницы таким образом.Вместо этого они используют тип содержимого "text / html", и в этом случае браузер вообще не использует синтаксический анализатор XML, он использует HTML.
Анализатор HTML просто игнорирует пространство имен для префикса сопоставлений,и просто «знает», какие имена элементов принадлежат каким пространствам имен.Это делает его в конечном итоге менее гибким, но в пределах его специализированной области, более надежным и простым в использовании.(В приведенном выше примере элемента title
он определяет, какое пространство имен применяется, просматривая элементы-предки title
s). Именно поэтому в документах XHTML не используются элементы с префиксом, поскольку анализатор HTML не распознает их.
Браузеры, (в любом случае, современные), затем имеют специализированные DOM-подобные API-методы и правила CSS, чтобы скрыть всю эту сложность пространства имен от автора javascript и css, и, таким образом, по большей части пространство имен можетАвторы веб-сайтов должны игнорировать их.
Автономные анализаторы HTML, однако, не всегда делают это.Вместо этого они помещают все элементы в пустое пространство имен, что означает, что их можно найти с помощью xpath, которые не включают префиксы в именах элементов, используя стандартные API-интерфейсы DOM.Для большинства практических целей это то же самое, что и при анализе в браузере с использованием их HTML-анализатора.
Итак, в общем, вам нужно знать, анализируете ли вы свой XHTML с помощью синтаксического анализатора XML или HTML, и как этот конкретный анализатор назначает элементы пространствам имен, чтобы иметь возможность написать правильный xpath для запросадля элементов в документе.