2009-11-26 5 views
2

Je veux juste faire une conversion directe (presque seulement chercher et remplacer) mais j'ai de la difficulté à mettre les choses en place - je me retrouve avec des liens hors de propos et du contenu dupliqué . Je suis sûr que je fais quelque chose de stupide avec mes tentatives de traverser le xml:)nokogiri: xml to html

J'essaie avec:

builder = Nokogiri::HTML::Builder.new do |doc| 
doc.html { 
    doc.body { 
    doc.div.wrapper! { 
    doc.h1 "Short" 

     xm.css('paragraph').each do |para| 

     doc.h3.para(:id => para['number']) { doc.text para['number'] } 

     doc.p.narrativeparagraph { 

      xm.css('paragraph inner-section').each do |section| 
       doc.span.innersection { doc.text section.content 

      xm.css('inner-section xref').each do |xref| 
       doc.a(:href => "#" + xref['number']) { doc.text xref['number'] } 
      end 

      xm.css('paragraph inner-text').each do |innertext| 
       doc.span.innertext { doc.text innertext.content } 
      end 

       } end #inner-section     

       } 

      end#end paragraph 
     }#end wrapper 
     }#end body 
    }#end html 
    end#end builder 

sur:

<?xml version="1.0"?> 

<looseleaf> 

<paragraph number="1"> 
    <inner-section> blah one blah <xref number="link1location"></xref> 
    <inner-text> blah two blah blah </inner-text> 
    blah three 
    </inner-section> 
</paragraph> 

<paragraph number="2"> 
<inner-section> blah four blah <xref number="link2location"></xref> 
    <inner-text>blah five blah blah </inner-text> 
     blah six 
</inner-section> 
</paragraph> 

</looseleaf> 

pour créer:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC- html40/loose.dtd"> 
<html> 
<body> 
<div id="wrapper"> 
<h1>Short</h1> 
<h3 class="para" id="1">1</h3> 
<p class="narrativeparagraph"> 
<span class="innersection"> blah one blah <a href="#link1location">link1location</a> 
<span class="innertext"> blah two blah blah </span> 
    blah three</span> 
</p> 

<h3 class="para" id="2">2</h3> 
<p class="narrativeparagraph"> 
<span class="innersection"> blah four blah <a ref="#link2location">link2location</a> 
<span class="innertext">blah five blah blah </span> 
    blah six</span></p> 

J'ai essayé toutes sortes de choses pour que cela fonctionne, la structure html de base sort d'accord, mais les enfants des paragraphes sont en désordre - toute aide serait très appréciée. Cordialement, Ritchie

+1

Tous les noobs dans le même bateau que moi - J'ai reculé d'essayer d'utiliser Builder et j'arrive lentement mais sûrement avec: frag.xpath ("// paragraphe"). Chaque {| div | div.name = "p"; div.set_attribute ("class", "narrativeparagraph")} frag.css ('section interne xref'). chaque {| xref | xref.name = "a"; xref.set_attribute ("href", "#" + xref ['nombre']); xref.content = xref ['number']} – ritchielee

+0

Le code html que vous avez donné à titre d'exemple - est-ce ce que vous * aimeriez * construire? Pouvez-vous donner un exemple de la façon dont cela se passe? –

Répondre

1

Il y a plusieurs façons de le faire, mais si vous insistez sur le chemin Builder, je ferais une fonction qui se traduit par <paragraph>-<p>.

builder = Nokogiri::HTML::Builder.new do |doc| 
    doc.html { 
    doc.body { 
     doc.div.wrapper! { 
     doc.h1 "Short" 
     xm.css('paragraph').each do |para| 
      doc << translate_paragraph para.dup 
     end #para 
    }#end body 
    }#end html 
end#end builder 

def translate_paragraph(p) 
    # Change '<paragraph>' to '<p>' 
    p.name = 'p' 

    # Change '<innersection>' to '<span class='innersection'>' 
    p.css('innersection').each { |tag| 
    tag.name = 'span' 
    tag['class'] = 'innersection' 
    } 

    # ... 
end 

Pas parfait, mais cela fonctionne avec Builder.

Je considérerais aussi XSLT, ou traversant l'arborescence HTML de manière récursive et construisant à partir de là.