¿Cómo puedo obtener nokogiri para seleccionar atributos de nodo y añadirlos a otros nodos?
Pregunta
¿Es posible agarrar los atributos de un elemento siguiente y utilizarlos en la anterior así:?
<title>Section X</title>
<paragraph number="1">Stuff</paragraph>
<title>Section Y</title>
<paragraph number="2">Stuff</paragraph>
en
<title id="ID1">1. Section X</title>
<paragraph number="1">Stuff</paragraph>
<title id="ID2">2. Section Y</title>
<paragraph number="2">Stuff</paragraph>
Tengo algo como esto, pero conseguir nodeset o de cadena errores:
frag = Nokogiri::XML(File.open("test.xml"))
frag.css('title').each { |text|
text.set_attribute('id', "ID" + frag.css("title > paragraph['number']"))}
Solución
next_sibling
debe hacer el trabajo
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>
Debido a que el espacio en blanco es también un nodo, usted tiene que llamar next_sibling
dos veces. Tal vez hay una manera de evitar esto.
Alternativamente, puede utilizar una expresión XPath para seleccionar el atributo número del siguiente párrafo
t['id'] = "ID#{t.xpath('following-sibling::paragraph/@number').first}"
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow