2016-03-16 2 views
0

Я ищу в XPath Топоры и я могу понять все ниже осиЧто такое пространство имен в XPath осей

«предок»
| 'ancestor-or-self'
| 'attribute'
| 'ребенок'
| 'потомок'
| 'descendant-or-self'
| 'следующий'
| 'next-sibling'
| 'parent'
| 'previous'
| 'previous-sibling'
| «Я»

Единственные оси я не могу понять,

| 'namespace'

Может ли кто-нибудь дать мне хороший пример и понять, что на самом деле означает «пространство имен»?

Пример: -

Open: - https://www.google.co.in/

ИЛИ

HTML код

<a style="left:-1000em;position:absolute" href="/setprefs?suggon=2&prev=https://www.google.co.in/&sig=0_ujdR1PrGxEbi_EiD6RbIb4VvaXc%3D">Screen-reader users, click here to turn off Google Instant.</a> 

Я пытаюсь ниже XPath

//a[@style='left:-1000em;position:absolute']/namespace::*[name()='google'] 

W Я ошибаюсь, я делаю это в пространстве имен?

Кроме того, я также хочу знать, что использование осей | 'атрибут'. где и в какой ситуации полезно

+1

Возможный дубликат (http://stackoverflow.com/questions/1181888/what-does-xmlns- in-xml-значение) – Quentin

+1

Возможный дубликат [Как работают пространства имен XML] (http://stackoverflow.com/questions/8863233/how-do-xml-namespaces-work) – Quentin

+1

Возможный дубликат [Что такое пространства имен XML для ?] (http://stackoverflow.com/questions/128389/what-are-xml-namespaces-for) – Quentin

ответ

1

В соответствии с логикой он должен выбрать все элементы, связанные с пространством имен. Однако его поведение немного сложнее, поэтому оно часто не используется. (Это считается устаревшим в XPath 2.0.)

<?xml version="1.0" encoding="UTF-8"?> 
<ROOT> 
    <BASE xmlns:base="http://www.tei-c.org/ns/1.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> 
     <base:p>XXX</base:p> 
     <dc:p>yyy</dc:p> 
    </BASE> 
    <NEXT xmlns="http://purl.org/dc/elements/1.1/"> 
     <p>zzz</p> 
    </NEXT> 
</ROOT> 

XPath (2.0):

//*[namespace::dc] 

выбирает весь BASE элемент. Он похож на:

//*[namespace-uri-for-prefix('dc', .)] 

который не работает в XPath 1.0.

//*[namespace::*='http://purl.org/dc/elements/1.1/'] 

выбирает оба BASE, а также NEXT элементы. Такое использование считается немного странным, и оно не рекомендуется.

//*[local-name(.) eq 'p' and namespace::*='http://purl.org/dc/elements/1.1/'] 

выбирает все элементы p, что означает, base:pdc:p, а также p.

//*[local-name(.) eq 'p' and namespace::dc] 

выбирает base:p и dc:p из BASE элемента.

//*[local-name(.) eq 'p' and namespace-uri() eq 'http://purl.org/dc/elements/1.1/'] 

выбирает все элементы, ограниченные URI. Это означает, что это самый точный вариант.

Или можно попробовать что-то вроде:

//*[contains(namespace-uri(), 'purl')] 

или

//self::BASE/*[contains(namespace-uri(), 'purl')] 

Испытано в Oxygen Автор 17,1

UPDATE

Что касается вашей потребности, его кажется, вы, вероятно, пытаетесь выбрать элемент wit h строка google в атрибуте href, а не в определенном пространстве имен. Как насчет //a[contains(@href, 'google')]?

ОБНОВЛЕНИЕ II

Как указано в комментариях UPDATE был рабочий раствор. Тем не менее, я думаю, что следующая информация также полезна:

+0

Спасибо за ответ. Я добавил пример в своем вопросе. Не могли бы вы заглянуть и рассказать мне, что я делаю неправильно? –

+0

за ваши усилия. Спасибо :) .. –

+0

Я опубликовал вопрос по теме как : - HTML код Screen-reader users, click here to turn off Google Instant. Я пытаюсь ниже XPath // а [@ стиль = 'слева направо: -1000em; позиция: абсолютная']/пространство имен :: * [имя() = 'Google'] Что неправильно, я делаю это в пространстве имен? –

3

namespace:: ось выбирает namespace nodes. Ничего особенного.

И узлов пространств имен, согласно связанной спецификации включает в себя:

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

  • каждый атрибут на предок элемента, имя которого начинается xmlns:, если сам элемент или ближайший предок не переопределяет префикс

  • атрибут xmlns, если элемент или какой-то предок имеет xmlns атрибут, и значение атрибута xmlns для ближайшего такого элемента не пусто

Например, если следующий XML элемент:

выражение XPath
<a xmlns:google="some namespace uri here"/> 

ниже будет возвращать xmlns:google атрибут [demo]. :

//a/namespace::*[name()='google'] 

Этот пример соответствует первой точке пули, упомянутой выше, так как это xmlns:googleатрибута, в контекстном элементе <a>, название которого начинается с xmlns:.


Аналогичные разъяснения для attribute axis; он просто выбирает атрибуты XML.

Вы можете рассматривать ось attribute как более длинную версию @, которую вы уже использовали. Например, два выражения ниже означают то же самое: [? Что «XMLNS» в XML означают]

//a[attribute::style='left:-1000em;position:absolute'] 
//a[@style='left:-1000em;position:absolute'] 
+0

Не могли бы вы предоставить аналогичный пример с 'namespace ::'? По сравнению с атрибутами существует проблема, потому что можно объявить пространство имен двумя основными способами (в родительском элементе, как атрибуте текущего элемента). Люди часто считают, что они пригодны для выбора отдельных элементов ** в конкретном пространстве имен. Это может быть удобно, но я думаю, что нет способа, как это сделать. –

+0

* «Не могли бы вы предоставить аналогичный пример с пространством имен ::?" *. Вы имеете в виду пример того, что фильтрующий элемент по значению пространства имен/URI, например: '// a [namespace :: * = 'некоторое пространство имен uri здесь]]? – har07

+0

Я пробовал то же самое в своем локальном, но он не работает. Я добавил в своем HTML-файле и попытаюсь найти его // a/namespace :: * [name() = 'google'] .. результат пуст –

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