Отвечая сначала на второй вопрос: вышеописанное выбирает всех следующих братьев и сестер, которые не являются ни элементами table
, ни ol
.
Вот почему: self::table[1]
выбирает собственный узел контекста (если он проходит проверку имени элемента table
) и фильтрует, чтобы выбрать только первый узел вдоль оси self ::. На self :: axis проходит не более одного узла, проходящего проверку имени элемента, поэтому [1]
является избыточным. self::table[1]
выбирает узел контекста, когда он является элементом таблицы, независимо от его положения среди его братьев и сестер. Так что not(self::table[1])
возвращает false всякий раз, когда узел контекста является элементом таблицы, независимо от его положения среди братьев и сестер.
Аналогично для self::ol[1]
.
Как сделать то, что вы пытаетесь сделать:
@ Джон Кугельман ответил почти правильно, но упускает из виду тот факт, что мы должны игнорировать элементы одного и того же уровня, включая table[@id='target']
. Я не думаю, что это возможно сделать правильно в чистом XPath 1.0. У вас есть возможность использовать XPath 2.0? Если вы работаете в браузере, ответ, как правило, нет.
Некоторые обходные пути:
- Пропускать первого брата по таблице и первого брата по таблице путем фильтрации на некоторой другой основе, например, их атрибутах;
- Выберите
//table[@id='target']
в качестве набора узлов, верните его в среду хоста (т.е. вне XPath, например, в JavaScript), выполните цикл по этому набору узлов; внутри цикла: выберите following-sibling::*
через XPath, итерируйте по , который вне XPath, и протестируйте каждый результат (вне XPath), чтобы увидеть, является ли это первая таблица или ол.
- Выберите
//table[@id='target']
в качестве набора узлов, верните его в среду хоста (т.е. вне XPath, например, в JavaScript), выполните цикл по этому набору узлов; внутри цикла: выберите generate-id(following-sibling::table[1])
и generate-id(following-sibling::ol[1])
через XPath, получите эти значения в переменные JS t1id и o1id и создайте строку для выражения XPath, используя форму 'following-sibling::*[generate-id() != ' + t1id + ' and generate-id() != ' + o1id + ']'
. Выберите эту строку в XPath, и у вас есть свой ответ! : -Р
Обновление: Решение возможно в XSLT 1.0 - см. @ Dimitre's.