Учитывая разметку типа:
foo
bar
jim
and then jam
Мне нужно выбрать первые три , но не последние. Логика такова: «Выберите все
code
элементы, у которых есть предшествующий -или -следующий -брат-элемент , который также является code
, если только не существует одного или нескольких текстовых узлов с не -пробельным содержимым между ними.
Учитывая, что я использую Nokogiri (, который использует libxml2 ), я могу использовать только выражения XPath 1.0.
Хотя желательно сложное выражение XPath, код/итерации Ruby для выполнения того же самого в документе Nokogiri также приемлемы.
Обратите внимание, что селектор CSS соседнего брата игнорирует узлы, не являющиеся элементами -, поэтому выбор nokodoc.css('code + code')
приведет к неправильному выбору последнего блока .
Nokogiri.XML(' and ').css('* + *').map(&:name)
#=> ["b", "c"]
Изменить:Еще тестовые примеры, для ясности:
- Go to
N
and
then Y
Y
Y
.
- If you see
N
or N
then…
Elsewhere there might be: N
N
across parents.
Then: Y
Y
Y
and N
.
N
N
elements interrupt, too.
Все Y
выше должны быть выбраны. Ни один из N
не должен быть выбран. Содержимое используется только для указания того, что должно быть выбрано. :вы не можете использовать содержимое, чтобы определить, следует ли выбирать элемент.
Элементы контекста, в которых появляется , не имеют значения. Они могут появиться в
, они могут появиться в
, они могут появиться в чем-то еще.
Я хочу выбрать все последовательные прогоны одновременно.Это не ошибка, что в середине одного из наборов
Y
стоит пробел.