Выберите соседние одноуровневые элементы, не пересекая текстовые узлы без пробелов -

Учитывая разметку типа:

foobar 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 YYY.
  • If you see N or N then…

Elsewhere there might be: N

N across parents.

Then: Y YY and N.

N
N elements interrupt, too.

Все Yвыше должны быть выбраны. Ни один из Nне должен быть выбран. Содержимое используется только для указания того, что должно быть выбрано. :вы не можете использовать содержимое, чтобы определить, следует ли выбирать элемент.

Элементы контекста, в которых появляется , не имеют значения. Они могут появиться в

  • , они могут появиться в

    , они могут появиться в чем-то еще.

    Я хочу выбрать все последовательные прогоны одновременно.Это не ошибка, что в середине одного из наборов Yстоит пробел.

  • 5
    задан Phrogz 26 June 2012 в 13:19
    поделиться