В моем XML-документе есть произвольно вложенные разделы. Учитывая ссылку на конкретный раздел, мне нужно найти все TextNode
s в этом разделе , не включая подразделы.Найти все узлы text-абстракции(), кроме подраздела
Например, если ссылка на #a1
узел ниже, мне нужно только найти «А1» и «А1» текстовые узлы:
<root>
<section id="a1">
<b>A1 <c>A1</c></b>
<b>A1 <c>A1</c></b>
<section id="a1.1">
<b>A1.1 <c>A1.1</c></b>
</section>
<section id="a1.2">
<b>A1.2 <c>A1.2</c></b>
<section id="a1.2.1">
<b>A1.2.1</b>
</section>
<b>A1.2 <c>A1.2</c></b>
</section>
</section>
<section id="a2">
<b>A2 <c>A2</c></b>
</section>
</root>
В случае это не было очевидно, выше составленные данные. В частности, атрибуты id
могут не существовать в реальном документе.
Лучшее, что я придумал сейчас, чтобы найти все текстовые узлы в пределах раздела, а затем использовать Ruby, чтобы вычесть из те, которые я не хочу:
def own_text(node)
node.xpath('.//text()') - node.xpath('.//section//text()')
end
doc = Nokogiri.XML(mydoc,&:noblanks)
p own_text(doc.at("#a1")).length #=> 4
Могу ли я ремесло одно выражение XPath 1.0, чтобы найти эти узлы напрямую? Что-то вроде:
.//text()[ancestor::section = self] # self being the original context node
Можете ли вы сделать это, не полагаясь на атрибут id? Это был всего лишь демонстрационный документ, иллюстрирующий и четко обсуждающий этот вопрос. Представьте вложенные элементы '' без каких-либо отличительных атрибутов. –
Phrogz
Да, см. Обновление этого ответа. –
Nice; Я забыл об использовании 'count()', но даже после того, как вы начали его использовать, я не мог понять, как вы «храните» счет. Это все еще не будет работать непосредственно в Ruby/XPath (поскольку уникальный узел является '.' При запуске нового контекста), но это, похоже, отвечает на вопрос об общем XPath. – Phrogz