[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