2013-05-09 2 views
1

Структуры документа:Путаница относительно оси потомков и «//»

<program> 
<projectionDay> 
    <projection/> 
    <projection/> 
</projectionDay> 
<projectionDay> 
    <projection/> 
    <projection/> 
</projectionDay> 
</program> 

Я хочу, чтобы выбрать первый и последний выступ (через весь документ).

Это возвращает:

/descendant::projection[position() = 1 or position() = last()] 

Это возвращает первый и последний в projectionDay

//projection[position() = 1 or position() = last()] 

Почему это так?

+1

'//' выбирает все соответствующие узлы из текущего узла. Вы выполняете этот запрос xpath с узла ' 'или из корня? – themanatuf

ответ

5

Ваш первый запрос с использованием descendant извлекает все <projection/> элементы, затем фильтрует этот результирующий набор для первого и последнего элемента:

/descendant::projection[position() = 1 or position() = last()] 

// является аббревиатурой для /descendant-or-self::*/. Таким образом, ваш второй запрос фактически означает

/descendant-or-self::*/projection[position() = 1 or position() = last()] 

который смотрит во все элементы (здесь:. Каждый <projectionDay/>, и возвращает первый и последний <projection/> элемент внутри этого элемента


Чтобы вернуть первый и последний элемент над всем <projeectionDay/> s, положить все до предиката в круглые скобки:

(/descendant-or-self::*/projection)[position() = 1 or position() = last()] 

или сокращенно:

(//projection)[position() = 1 or position() = last()] 
Смежные вопросы