Class: Serialbench::Serializers::Xml::SaxonSerializer
Overview
Saxon-HE via its Java CLI: the reference XSLT 2.0/3.0 engine.
Cold-process semantics: every iteration is a full JVM + compile +
transform, so ips is comparable to leptris only end-to-end, never
per-transform — features record cold_process: true.
Instance Method Summary
collapse
format, #generate_xml, #parse_dom, #parse_sax
#generate, #get_version, #initialize, #parse, #require_library, #stream_parse, #supports?
Instance Method Details
#available? ⇒ Boolean
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
# File 'lib/serialbench/serializers/xml/saxon_serializer.rb', line 46
def available?
return @available if defined?(@available)
@available = begin
cp = classpath
raise LoadError, 'SAXON_JAR / XMLRESOLVER_JAR not set' unless cp
out, _err, st = Open3.capture3('java', '-cp', cp, 'net.sf.saxon.Version')
raise LoadError, 'java failed' unless st.success?
true
rescue StandardError, LoadError => e
warn "#{name} unavailable: #{e.class}: #{e.message}"
false
end
end
|
#capabilities ⇒ Object
19
20
21
|
# File 'lib/serialbench/serializers/xml/saxon_serializer.rb', line 19
def capabilities
Set.new(%i[xslt xslt30])
end
|
#classpath ⇒ Object
27
28
29
30
|
# File 'lib/serialbench/serializers/xml/saxon_serializer.rb', line 27
def classpath
jars = [ENV['SAXON_JAR'], ENV['XMLRESOLVER_JAR']].compact
jars.empty? ? nil : jars.join(File::PATH_SEPARATOR)
end
|
#features ⇒ Object
23
24
25
|
# File 'lib/serialbench/serializers/xml/saxon_serializer.rb', line 23
def features
{ 'xslt_version' => '3.0', 'cold_process' => true }
end
|
#name ⇒ Object
15
16
17
|
# File 'lib/serialbench/serializers/xml/saxon_serializer.rb', line 15
def name
'saxon-he'
end
|
#version ⇒ Object
63
64
65
66
67
68
|
# File 'lib/serialbench/serializers/xml/saxon_serializer.rb', line 63
def version
return 'unknown' unless available?
out, = Open3.capture3('java', '-cp', classpath, 'net.sf.saxon.Version')
out[/Saxon-HE (\S+)/, 1] || out.strip[0, 40]
end
|
#xslt_apply(source_xml, stylesheet) ⇒ Object
32
33
34
35
36
37
38
39
40
41
42
43
44
|
# File 'lib/serialbench/serializers/xml/saxon_serializer.rb', line 32
def xslt_apply(source_xml, stylesheet)
Dir.mktmpdir('saxonbench') do |dir|
src = File.join(dir, 's.xml')
xsl = File.join(dir, 's.xsl')
File.write(src, source_xml)
File.write(xsl, stylesheet)
out, _err, _st = Open3.capture3('java', '-cp', classpath, 'net.sf.saxon.Transform',
"-xsl:#{xsl}", "-s:#{src}")
raise Error, "saxon transform failed: #{out}#{_err}"[0, 200] unless _st.success?
out
end
end
|