[ruby-it] Trasformazioni xml + xsl con Ruby, rjb e un pizzico di java (xalan)

Stefano Guglielmetti jeko a interact.it
Lun 10 Dic 2007 15:06:08 CET


la mia esigenza era di fare trasformazioni xml+xsl su una piattaforma windows
 
ovviamente ho scelto ruby come linguaggio (quella era la costante :) )
 
la soluzione ruby xslt su windows è scamuffa e poco performante, allora ho passato in rassegna varie alternative e sono giunto alla soluzione seguendo questi passi
 
1. installare rjb (ruby-java binding)
 
gem install rjb
 
2. scaricare xalan http://mirror.nohup.it/apache/xml/xalan-j/binaries/xalan-j_2_7_1-bin.zip
 
3. impostare la variabile di sistema JAVA_HOME (per il mio sistema C:\Programmi\Java\jdk1.5.0_03)... ovviamnete il jdk deve essere installato e funzionante
 
lo script che uso è stato scopiazzato da http://www.ruby-forum.com/topic/95050
 
ho seguito i consigli del tipo e l'ho adattato in modo da leggere un un file xsl statico e una stringa come input xml
viene restituita una stringa (non ho delegato a java la responsabilità di scrivere l'out su disco... )
 
----------- XalanSupport.rb -------------
 
require 'rjb'
module XalanSupport
  def XalanSupport.load_Xalan_libraries
    classpath = ''
    ['serializer.jar', 'xml-apis.jar', 'xercesImpl.jar', 'xalan.jar'].each do |lib_name|
      classpath << "#{lib_name};" 
    end
    Rjb::load("#{classpath}", ['-Xmx512M'])
  end
  def XalanSupport.do_XSL_transform(instring, xsl_file_name)
    XalanSupport.load_Xalan_libraries
    string_reader_class = Rjb::import('java.io.StringReader')
    string_writer_class = Rjb::import('java.io.StringWriter')
    stream_source_class = Rjb::import('javax.xml.transform.stream.StreamSource')
    stream_result_class = Rjb::import('javax.xml.transform.stream.StreamResult')
    transformer_factory_class = Rjb::import('javax.xml.transform.TransformerFactory')
    input_string_reader = string_reader_class.new(instring)
    output_string_writer = string_writer_class.new
    source = stream_source_class.new(input_string_reader)
    result = stream_result_class.new(output_string_writer)
    transformer_factory = transformer_factory_class.newInstance
    transformer = transformer_factory.newTransformer(stream_source_class.new(xsl_file_name))
    transformer.transform(source, result)
    result.getWriter.getBuffer.toString
  end
end
 
--------- end XalanSupport.rb ------------
 
lo potete usare cosi
 
out = XalanSupport.do_XSL_transform(input_xml, 'test.xsl')
File.open('test.html', 'w') do |f|
  f.write out
end
 
bella!!!
jeko
-------------- parte successiva --------------
Un allegato non testuale è stato rimosso....
Nome:        non disponibile
Tipo:        application/ms-tnef
Dimensione:  6264 bytes
Descrizione: non disponibile
Url:         http://lists.ruby-it.org/pipermail/ml/attachments/20071210/f683e454/attachment.bin 


Maggiori informazioni sulla lista Ml