Как я могу заставить nokogiri выбрать атрибуты узла и добавить их в другие узлы? - PullRequest
3 голосов
/ 03 декабря 2009

Можно ли получить атрибуты следующего элемента и использовать их в предыдущем, например, так:

<title>Section X</title>
<paragraph number="1">Stuff</paragraph>
<title>Section Y</title>
<paragraph number="2">Stuff</paragraph>

в

<title id="ID1">1. Section X</title>
<paragraph number="1">Stuff</paragraph>
<title id="ID2">2. Section Y</title>
<paragraph number="2">Stuff</paragraph>

У меня есть что-то вроде этого, но я получаю ноды или строковые ошибки:

frag = Nokogiri::XML(File.open("test.xml"))

frag.css('title').each { |text| 
text.set_attribute('id', "ID" + frag.css("title > paragraph['number']"))}

1 Ответ

1 голос
/ 06 декабря 2009

next_sibling должен сделать работу

require 'rubygems'
require 'nokogiri'

frag = Nokogiri::XML(DATA)
frag.css('title').each { |t| t['id'] = "ID#{t.next_sibling.next_sibling['number']}" }
puts frag.to_xml

__END__
<root>
<title>Section X</title>
<paragraph number="1">Stuff</paragraph>
<title>Section Y</title>
<paragraph number="2">Stuff</paragraph>
</root>

Поскольку пробел также является узлом, вы должны вызвать next_sibling дважды. Может быть, есть способ избежать этого.

В качестве альтернативы вы можете использовать выражение xpath, чтобы выбрать числовой атрибут следующего абзаца

t['id'] = "ID#{t.xpath('following-sibling::paragraph/@number').first}"
...