saxon-rb 0.5.0-java → 0.6.0-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +41 -0
- data/lib/saxon/nokogiri.rb +1 -1
- data/lib/saxon/processor.rb +12 -0
- data/lib/saxon/serializer/destination.rb +80 -0
- data/lib/saxon/serializer/object.rb +93 -0
- data/lib/saxon/serializer/output_properties.rb +83 -0
- data/lib/saxon/serializer.rb +3 -137
- data/lib/saxon/version.rb +1 -1
- data/lib/saxon/xdm/node.rb +4 -3
- data/lib/saxon/xslt/executable.rb +21 -46
- data/lib/saxon/xslt/invocation.rb +96 -0
- data/saxon-rb.gemspec +1 -1
- metadata +8 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2e9afbc5a2644034bc285b3c3cd4e78f852b715d7a096ff8f7a6386730501598
|
4
|
+
data.tar.gz: fe9c135af6356690fcca7b4f1dc2d9656cce44018806c3b5f6c9f4b6407c576d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c59e0f986b8bbf4de77b18feba99a61c8e724df537679b0e674bc142a0d2b476026bb01579dcd2ec6e9b4f246493db3b892fbe7e997848eb06bf5c7bd8e2f5ea
|
7
|
+
data.tar.gz: 182d383aced898a376d37eaedb60ff80461910d3451e119f2bf6e97ebe37d8c64e600563ba968efec22f49ae02f025ec3725f00a2cb9af10813af8e20fc13100
|
data/README.md
CHANGED
@@ -194,6 +194,47 @@ result = xslt.call_template('template-name', {
|
|
194
194
|
|
195
195
|
Global and initial template parameters can be set at compiler creation time, compile time, or execution time. See [Setting parameters](#label-Setting+parameters) for details.
|
196
196
|
|
197
|
+
To serialize the document you can, of course, just call `#to_s` on the result:
|
198
|
+
|
199
|
+
```ruby
|
200
|
+
result = xslt.apply_templates(input)
|
201
|
+
puts result.to_s #=> '<?xml version="1.0"...'
|
202
|
+
```
|
203
|
+
|
204
|
+
You can also serialize directly to a file path or to any IO instance.
|
205
|
+
|
206
|
+
```ruby
|
207
|
+
result = xslt.apply_templates(input)
|
208
|
+
result.serialize('/path/to/output.xml')
|
209
|
+
|
210
|
+
result_2 = xslt.apply_templates(input)
|
211
|
+
result_2.serialize($stderr)
|
212
|
+
```
|
213
|
+
|
214
|
+
You can override serialization options that were set by `<xsl:output/>` in your XSLT:
|
215
|
+
|
216
|
+
```ruby
|
217
|
+
result = xslt.apply_templates(input)
|
218
|
+
result.serialize('/path/to/output.xml') {
|
219
|
+
output_property[:indent] = 'yes'
|
220
|
+
}
|
221
|
+
```
|
222
|
+
|
223
|
+
You can also obtain the result of the transform as an XDM Value:
|
224
|
+
|
225
|
+
```ruby
|
226
|
+
result = xslt.apply_templates(input)
|
227
|
+
result.xdm_value #=> #<Saxon::XDM::Node...>
|
228
|
+
```
|
229
|
+
|
230
|
+
You also have easy access to provide an instance of a class implementing Saxon's `net.sf.saxon.s9api.Destination` interface:
|
231
|
+
|
232
|
+
```ruby
|
233
|
+
dom_document = javax.xml.parsers.DocumentBuilderFactory.newInstance.builder.newDocument
|
234
|
+
destination = Saxon::S9API::DOMDestination.new(dom_document)
|
235
|
+
result = xslt.apply_templates(input).to_destination(destination)
|
236
|
+
```
|
237
|
+
|
197
238
|
#### Setting parameters
|
198
239
|
|
199
240
|
There are four kinds of parameters you can set: *Static parameters*, which are
|
data/lib/saxon/nokogiri.rb
CHANGED
@@ -44,7 +44,7 @@ module Saxon
|
|
44
44
|
# @return [String] a serialization of the the input document
|
45
45
|
def serialize(doc_node)
|
46
46
|
s9_transformer = @s9_xslt_executable.load30
|
47
|
-
serializer = Saxon::Serializer.new(s9_transformer.newSerializer)
|
47
|
+
serializer = Saxon::Serializer::Object.new(s9_transformer.newSerializer)
|
48
48
|
serializer.serialize(doc_node.to_java)
|
49
49
|
end
|
50
50
|
|
data/lib/saxon/processor.rb
CHANGED
@@ -4,6 +4,7 @@ require 'saxon/configuration'
|
|
4
4
|
require 'saxon/document_builder'
|
5
5
|
require 'saxon/xpath'
|
6
6
|
require 'saxon/xslt'
|
7
|
+
require 'saxon/serializer'
|
7
8
|
|
8
9
|
module Saxon
|
9
10
|
# Saxon::Processor wraps the S9API::Processor object. This is the object
|
@@ -82,6 +83,17 @@ module Saxon
|
|
82
83
|
Saxon::XSLT::Compiler.create(self, &block)
|
83
84
|
end
|
84
85
|
|
86
|
+
# Generate a new +Serializer+ for directly serializing XDM Values that uses
|
87
|
+
# this +Processor+. +Serializer+s are effectively one-shot objects, and
|
88
|
+
# shouldn't be reused.
|
89
|
+
#
|
90
|
+
# @yield the block passed will be called bound to the serializer instance. See
|
91
|
+
# {Saxon::Serializer::Object.create}
|
92
|
+
# @return [Saxon::Serializer::Object]
|
93
|
+
def serializer(&block)
|
94
|
+
Saxon::Serializer::Object.create(self, &block)
|
95
|
+
end
|
96
|
+
|
85
97
|
# @return [net.sf.saxon.s9api.Processor] The underlying Saxon processor
|
86
98
|
def to_java
|
87
99
|
@s9_processor
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require_relative '../s9api'
|
2
|
+
require_relative './output_properties'
|
3
|
+
|
4
|
+
module Saxon
|
5
|
+
module Serializer
|
6
|
+
# A Saxon Serializer to be used as a Destination for a transformation rather
|
7
|
+
# than being directly called with existing XDM objects
|
8
|
+
class Destination
|
9
|
+
include OutputProperties
|
10
|
+
|
11
|
+
attr_reader :s9_serializer, :invocation_lambda
|
12
|
+
|
13
|
+
# @api private
|
14
|
+
def initialize(s9_serializer, invocation_lambda, &block)
|
15
|
+
@s9_serializer, @invocation_lambda = s9_serializer, invocation_lambda
|
16
|
+
if block_given?
|
17
|
+
instance_exec(&block)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# @overload serialize(io)
|
22
|
+
# Serialize the transformation to an IO
|
23
|
+
# @param [File, IO] io The IO to serialize to
|
24
|
+
# @return [nil]
|
25
|
+
# @overload serialize(path)
|
26
|
+
# Serialize the transformation to file <tt>path</tt>
|
27
|
+
# @param [String, Pathname] path The path of the file to serialize to
|
28
|
+
# @return [nil]
|
29
|
+
# @overload serialize
|
30
|
+
# Serialize the transformation to a String
|
31
|
+
# @return [String] The serialized XdmValue
|
32
|
+
def serialize(io_or_path = nil)
|
33
|
+
case io_or_path
|
34
|
+
when nil
|
35
|
+
serialize_to_string
|
36
|
+
when String, Pathname
|
37
|
+
serialize_to_file(io_or_path)
|
38
|
+
else
|
39
|
+
serialize_to_io(io_or_path)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# @return [Saxon::S9API::Serializer] The underlying Saxon Serializer object
|
44
|
+
def to_java
|
45
|
+
s9_serializer
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def run_transform!
|
51
|
+
invocation_lambda.call(self.to_java)
|
52
|
+
end
|
53
|
+
|
54
|
+
def serialize_to_string
|
55
|
+
str_encoding = output_property.fetch(:encoding, Encoding.default_internal || Encoding.default_external)
|
56
|
+
StringIO.open { |io|
|
57
|
+
io.binmode
|
58
|
+
set_output_io(io)
|
59
|
+
run_transform!
|
60
|
+
io.string.force_encoding(str_encoding)
|
61
|
+
}
|
62
|
+
end
|
63
|
+
|
64
|
+
def serialize_to_io(io)
|
65
|
+
set_output_io(io)
|
66
|
+
run_transform!
|
67
|
+
end
|
68
|
+
|
69
|
+
def set_output_io(io)
|
70
|
+
s9_serializer.setOutputStream(io.to_outputstream)
|
71
|
+
end
|
72
|
+
|
73
|
+
def serialize_to_file(path)
|
74
|
+
file = Java::JavaIO::File.new(path.to_s)
|
75
|
+
s9_serializer.setOutputFile(file)
|
76
|
+
run_transform!
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require_relative '../s9api'
|
2
|
+
require_relative './output_properties'
|
3
|
+
require 'stringio'
|
4
|
+
|
5
|
+
module Saxon
|
6
|
+
module Serializer
|
7
|
+
# A Saxon Serializer to be used directly with XDM Values rather than being
|
8
|
+
# called as a Destination for a transformation.
|
9
|
+
class Object
|
10
|
+
# Create a serializer from the passed in +Processor+. When called with a
|
11
|
+
# block, the block will be executed via instance-exec so that output
|
12
|
+
# properties can be set, e.g.
|
13
|
+
#
|
14
|
+
# Serializer::Object.create(processor) {
|
15
|
+
# output_property[:indent] = 'yes'
|
16
|
+
# }
|
17
|
+
#
|
18
|
+
# @param processor [Saxon::Processor] the processor to create this
|
19
|
+
# +Serializer::Object+ from
|
20
|
+
# @yield the passed block bound via instance-exec to the new serializer
|
21
|
+
def self.create(processor, &block)
|
22
|
+
new(processor.to_java.newSerializer, &block)
|
23
|
+
end
|
24
|
+
|
25
|
+
include OutputProperties
|
26
|
+
|
27
|
+
attr_reader :s9_serializer
|
28
|
+
private :s9_serializer
|
29
|
+
|
30
|
+
# @api private
|
31
|
+
def initialize(s9_serializer, &block)
|
32
|
+
@s9_serializer = s9_serializer
|
33
|
+
if block_given?
|
34
|
+
instance_exec(&block)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# @overload serialize(xdm_value, io)
|
39
|
+
# Serialize an XdmValue to an IO
|
40
|
+
# @param [Saxon::XdmValue] xdm_value The XdmValue to serialize
|
41
|
+
# @param [File, IO] io The IO to serialize to
|
42
|
+
# @return [nil]
|
43
|
+
# @overload serialize(xdm_value, path)
|
44
|
+
# Serialize an XdmValue to file <tt>path</tt>
|
45
|
+
# @param [Saxon::XdmValue] xdm_value The XdmValue to serialize
|
46
|
+
# @param [String, Pathname] path The path of the file to serialize to
|
47
|
+
# @return [nil]
|
48
|
+
# @overload serialize(xdm_value)
|
49
|
+
# Serialize an XdmValue to a String
|
50
|
+
# @param [Saxon::XdmValue] xdm_value The XdmValue to serialize
|
51
|
+
# @return [String] The serialized XdmValue
|
52
|
+
def serialize(xdm_value, io_or_path = nil)
|
53
|
+
case io_or_path
|
54
|
+
when nil
|
55
|
+
serialize_to_string(xdm_value)
|
56
|
+
when String, Pathname
|
57
|
+
serialize_to_file(xdm_value, io_or_path)
|
58
|
+
else
|
59
|
+
serialize_to_io(xdm_value, io_or_path)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# @return [Saxon::S9API::Serializer] The underlying Saxon Serializer object
|
64
|
+
def to_java
|
65
|
+
s9_serializer
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
def serialize_to_io(xdm_value, io)
|
71
|
+
s9_serializer.setOutputStream(io.to_outputstream)
|
72
|
+
s9_serializer.serializeXdmValue(xdm_value.to_java)
|
73
|
+
nil
|
74
|
+
end
|
75
|
+
|
76
|
+
def serialize_to_string(xdm_value)
|
77
|
+
str_encoding = output_property.fetch(:encoding, Encoding.default_internal || Encoding.default_external)
|
78
|
+
StringIO.open { |io|
|
79
|
+
io.binmode
|
80
|
+
serialize_to_io(xdm_value, io)
|
81
|
+
io.string.force_encoding(str_encoding)
|
82
|
+
}
|
83
|
+
end
|
84
|
+
|
85
|
+
def serialize_to_file(xdm_value, path)
|
86
|
+
file = Java::JavaIO::File.new(path.to_s)
|
87
|
+
s9_serializer.setOutputFile(file)
|
88
|
+
s9_serializer.serializeXdmValue(xdm_value.to_java)
|
89
|
+
nil
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
module Saxon
|
2
|
+
module Serializer
|
3
|
+
# Manage access to the serialization properties of this serializer, with
|
4
|
+
# hash-like access.
|
5
|
+
#
|
6
|
+
# Properties can be set explicitly through this API, or via XSLT or XQuery
|
7
|
+
# serialization options like +<xsl:output>+.
|
8
|
+
#
|
9
|
+
# Properties set explicitly here will override properties set through the
|
10
|
+
# document by +<xsl:output>+.
|
11
|
+
module OutputProperties
|
12
|
+
# @return [Saxon::Serializer::OutputProperties] hash-like access to the Output Properties
|
13
|
+
def output_property
|
14
|
+
@output_property ||= OutputProperties::Accessor.new(s9_serializer)
|
15
|
+
end
|
16
|
+
|
17
|
+
# @api private
|
18
|
+
#
|
19
|
+
# The private wrapper class that manages getting and setting output
|
20
|
+
# properties on a Serializer in an idiomatic Ruby-like way.
|
21
|
+
class Accessor
|
22
|
+
# @api private
|
23
|
+
# Provides mapping between symbols and the underlying Saxon property
|
24
|
+
# instances
|
25
|
+
def self.output_properties
|
26
|
+
@output_properties ||= Hash[
|
27
|
+
Saxon::S9API::Serializer::Property.values.map { |property|
|
28
|
+
qname = property.getQName
|
29
|
+
key = [
|
30
|
+
qname.getPrefix,
|
31
|
+
qname.getLocalName.tr('-', '_')
|
32
|
+
].reject { |str| str == '' }.join('_').to_sym
|
33
|
+
[key, property]
|
34
|
+
}
|
35
|
+
]
|
36
|
+
end
|
37
|
+
|
38
|
+
attr_reader :s9_serializer
|
39
|
+
|
40
|
+
# @api private
|
41
|
+
def initialize(s9_serializer)
|
42
|
+
@s9_serializer = s9_serializer
|
43
|
+
end
|
44
|
+
|
45
|
+
# @param [Symbol, Saxon::S9API::Serializer::Property] property The property to fetch
|
46
|
+
def [](property)
|
47
|
+
s9_serializer.getOutputProperty(resolved_property(property))
|
48
|
+
end
|
49
|
+
|
50
|
+
# @param [Symbol, Saxon::S9API::Serializer::Property] property The property to set
|
51
|
+
# @param [String] value The string value of the property
|
52
|
+
def []=(property, value)
|
53
|
+
s9_serializer.setOutputProperty(resolved_property(property), value)
|
54
|
+
end
|
55
|
+
|
56
|
+
# @overload fetch(property)
|
57
|
+
# @param [Symbol, Saxon::S9API::Serializer::Property] property The property to fetch
|
58
|
+
# @overload fetch(property, default)
|
59
|
+
# @param property [Symbol, Saxon::S9API::Serializer::Property] The property to fetch
|
60
|
+
# @param default [Object] The value to return if the property is unset
|
61
|
+
def fetch(property, default = nil)
|
62
|
+
explicit_value = self[property]
|
63
|
+
if explicit_value.nil? && !default.nil?
|
64
|
+
default
|
65
|
+
else
|
66
|
+
explicit_value
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
private
|
71
|
+
|
72
|
+
def resolved_property(property_key)
|
73
|
+
case property_key
|
74
|
+
when Symbol
|
75
|
+
self.class.output_properties.fetch(property_key)
|
76
|
+
else
|
77
|
+
property_key
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
data/lib/saxon/serializer.rb
CHANGED
@@ -1,143 +1,9 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
require_relative './serializer/destination.rb'
|
2
|
+
require_relative './serializer/object.rb'
|
3
3
|
|
4
4
|
module Saxon
|
5
5
|
# Serialize XDM objects.
|
6
|
-
|
7
|
-
# Manage access to the serialization properties of this serializer, with
|
8
|
-
# hash-like access.
|
9
|
-
#
|
10
|
-
# Properties can be set explicitly through this API, or via XSLT or XQuery
|
11
|
-
# serialization options like `<xsl:output>`.
|
12
|
-
#
|
13
|
-
# Properties set explicitly here will override properties set through the
|
14
|
-
# document like `<xsl:output>`.
|
15
|
-
class OutputProperties
|
16
|
-
# @api private
|
17
|
-
# Provides mapping between symbols and the underlying Saxon property
|
18
|
-
# instances
|
19
|
-
def self.output_properties
|
20
|
-
@output_properties ||= Hash[
|
21
|
-
Saxon::S9API::Serializer::Property.values.map { |property|
|
22
|
-
qname = property.getQName
|
23
|
-
key = [
|
24
|
-
qname.getPrefix,
|
25
|
-
qname.getLocalName.tr('-', '_')
|
26
|
-
].reject { |str| str == '' }.join('_').to_sym
|
27
|
-
[key, property]
|
28
|
-
}
|
29
|
-
]
|
30
|
-
end
|
31
|
-
|
32
|
-
attr_reader :s9_serializer
|
33
|
-
|
34
|
-
# @api private
|
35
|
-
def initialize(s9_serializer)
|
36
|
-
@s9_serializer = s9_serializer
|
37
|
-
end
|
38
|
-
|
39
|
-
# @param [Symbol, Saxon::S9API::Serializer::Property] property The property to fetch
|
40
|
-
def [](property)
|
41
|
-
s9_serializer.getOutputProperty(resolved_property(property))
|
42
|
-
end
|
43
|
-
|
44
|
-
# @param [Symbol, Saxon::S9API::Serializer::Property] property The property to set
|
45
|
-
# @param [String] value The string value of the property
|
46
|
-
def []=(property, value)
|
47
|
-
s9_serializer.setOutputProperty(resolved_property(property), value)
|
48
|
-
end
|
49
|
-
|
50
|
-
# @overload fetch(property)
|
51
|
-
# @param [Symbol, Saxon::S9API::Serializer::Property] property The property to fetch
|
52
|
-
# @overload fetch(property, default)
|
53
|
-
# @param property [Symbol, Saxon::S9API::Serializer::Property] The property to fetch
|
54
|
-
# @param default [Object] The value to return if the property is unset
|
55
|
-
def fetch(property, default = nil)
|
56
|
-
explicit_value = self[property]
|
57
|
-
if explicit_value.nil? && !default.nil?
|
58
|
-
default
|
59
|
-
else
|
60
|
-
explicit_value
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
private
|
65
|
-
def resolved_property(property_key)
|
66
|
-
case property_key
|
67
|
-
when Symbol
|
68
|
-
self.class.output_properties.fetch(property_key)
|
69
|
-
else
|
70
|
-
property_key
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
attr_reader :s9_serializer
|
76
|
-
private :s9_serializer
|
77
|
-
|
78
|
-
# @api private
|
79
|
-
def initialize(s9_serializer)
|
80
|
-
@s9_serializer = s9_serializer
|
81
|
-
end
|
82
|
-
|
83
|
-
# @return [Saxon::Serializer::OutputProperties] hash-like access to the Output Properties
|
84
|
-
def output_property
|
85
|
-
@output_property ||= OutputProperties.new(s9_serializer)
|
86
|
-
end
|
87
|
-
|
88
|
-
# @overload serialize(xdm_value, io)
|
89
|
-
# Serialize an XdmValue to an IO
|
90
|
-
# @param [Saxon::XdmValue] xdm_value The XdmValue to serialize
|
91
|
-
# @param [File, IO] io The IO to serialize to
|
92
|
-
# @return [nil]
|
93
|
-
# @overload serialize(xdm_value, path)
|
94
|
-
# Serialize an XdmValue to file <tt>path</tt>
|
95
|
-
# @param [Saxon::XdmValue] xdm_value The XdmValue to serialize
|
96
|
-
# @param [String, Pathname] path The path of the file to serialize to
|
97
|
-
# @return [nil]
|
98
|
-
# @overload serialize(xdm_value)
|
99
|
-
# Serialize an XdmValue to a String
|
100
|
-
# @param [Saxon::XdmValue] xdm_value The XdmValue to serialize
|
101
|
-
# @return [String] The serialized XdmValue
|
102
|
-
def serialize(xdm_value, io_or_path = nil)
|
103
|
-
case io_or_path
|
104
|
-
when nil
|
105
|
-
serialize_to_string(xdm_value)
|
106
|
-
when String, Pathname
|
107
|
-
serialize_to_file(xdm_value, io_or_path)
|
108
|
-
else
|
109
|
-
serialize_to_io(xdm_value, io_or_path)
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
# @return [Saxon::S9API::Serializer] The underlying Saxon Serializer object
|
114
|
-
def to_java
|
115
|
-
s9_serializer
|
116
|
-
end
|
117
|
-
|
118
|
-
private
|
119
|
-
|
120
|
-
def serialize_to_io(xdm_value, io)
|
121
|
-
s9_serializer.setOutputStream(io.to_outputstream)
|
122
|
-
s9_serializer.serializeXdmValue(xdm_value.to_java)
|
123
|
-
nil
|
124
|
-
end
|
125
|
-
|
126
|
-
def serialize_to_string(xdm_value)
|
127
|
-
str_encoding = output_property.fetch(:encoding, Encoding.default_internal || Encoding.default_external)
|
128
|
-
StringIO.open { |io|
|
129
|
-
io.binmode
|
130
|
-
serialize_to_io(xdm_value, io)
|
131
|
-
io.string.force_encoding(str_encoding)
|
132
|
-
}
|
133
|
-
end
|
134
|
-
|
135
|
-
def serialize_to_file(xdm_value, path)
|
136
|
-
file = Java::JavaIO::File.new(path)
|
137
|
-
s9_serializer.setOutputFile(file)
|
138
|
-
s9_serializer.serializeXdmValue(xdm_value.to_java)
|
139
|
-
nil
|
140
|
-
end
|
6
|
+
module Serializer
|
141
7
|
end
|
142
8
|
end
|
143
9
|
|
data/lib/saxon/version.rb
CHANGED
data/lib/saxon/xdm/node.rb
CHANGED
@@ -33,9 +33,10 @@ module Saxon
|
|
33
33
|
@node_name = node_name.nil? ? nil : Saxon::QName.new(node_name)
|
34
34
|
end
|
35
35
|
|
36
|
-
# What kind of node this is. Returns one of +:
|
37
|
-
# +:attribute+, +:namespace+, +:comment+,
|
38
|
-
# +:comment+
|
36
|
+
# What kind of node this is. Returns one of +:document+, +:element+,
|
37
|
+
# +:text+, +:attribute+, +:namespace+, +:comment+,
|
38
|
+
# +:processing_instruction+, or +:comment+
|
39
|
+
#
|
39
40
|
# @return [Symbol] the kind of node this is
|
40
41
|
def node_kind
|
41
42
|
@node_kind ||= case s9_xdm_node.nodeKind
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'forwardable'
|
2
2
|
require_relative 'evaluation_context'
|
3
|
+
require_relative 'invocation'
|
3
4
|
require_relative '../serializer'
|
4
5
|
require_relative '../xdm'
|
5
6
|
require_relative '../qname'
|
@@ -96,7 +97,7 @@ module Saxon
|
|
96
97
|
# to pass to the first template matched. Setting already-defined
|
97
98
|
# parameters will replace their value for this invocation of the XSLT
|
98
99
|
# only, it won't affect the {XSLT::Compiler}'s context.
|
99
|
-
# @return [Saxon::XSLT::
|
100
|
+
# @return [Saxon::XSLT::Invocation] the transformation result
|
100
101
|
def apply_templates(source, opts = {})
|
101
102
|
transformation(opts).apply_templates(source)
|
102
103
|
end
|
@@ -130,7 +131,7 @@ module Saxon
|
|
130
131
|
# to pass to the first template matched. Setting already-defined
|
131
132
|
# parameters will replace their value for this invocation of the XSLT
|
132
133
|
# only, it won't affect the {XSLT::Compiler}'s context.
|
133
|
-
# @return [Saxon::XSLT::
|
134
|
+
# @return [Saxon::XSLT::Invocation] the transformation result
|
134
135
|
def call_template(template_name = nil, opts = {})
|
135
136
|
transformation(opts).call_template(template_name)
|
136
137
|
end
|
@@ -155,14 +156,14 @@ module Saxon
|
|
155
156
|
# Additional global parameters to set. Setting already-defined
|
156
157
|
# parameters will replace their value for this invocation of the XSLT
|
157
158
|
# only, it won't affect the {XSLT::Compiler}'s context.
|
158
|
-
# @return [Saxon::XSLT::
|
159
|
+
# @return [Saxon::XSLT::Invocation] the transformation result
|
159
160
|
def call_function(function_name, opts = {})
|
160
161
|
args = opts.fetch(:args, [])
|
161
162
|
transformation(opts.reject { |k, v| k == :args }).call_function(function_name, args)
|
162
163
|
end
|
163
164
|
|
164
165
|
# @return [net.sf.saxon.s9api.XsltExecutable] the underlying Saxon
|
165
|
-
#
|
166
|
+
# +XsltExecutable+
|
166
167
|
def to_java
|
167
168
|
@s9_xslt_executable
|
168
169
|
end
|
@@ -213,6 +214,7 @@ module Saxon
|
|
213
214
|
@default_initial_template ||= Saxon::QName.clark('{http://www.w3.org/1999/XSL/Transform}initial-template')
|
214
215
|
end
|
215
216
|
|
217
|
+
# @api private
|
216
218
|
def initialize(args)
|
217
219
|
@s9_transformer = args.fetch(:s9_transformer)
|
218
220
|
@destination = args.fetch(:destination, nil)
|
@@ -225,57 +227,48 @@ module Saxon
|
|
225
227
|
# Apply templates to Source, using all the context set up when we were
|
226
228
|
# created.
|
227
229
|
def apply_templates(source)
|
228
|
-
|
230
|
+
transformation_invocation(:applyTemplates, source.to_java)
|
229
231
|
end
|
230
232
|
|
231
233
|
# Call the named template, using all the context set up when we were
|
232
234
|
# created.
|
233
235
|
def call_template(template_name)
|
234
|
-
|
236
|
+
transformation_invocation(:callTemplate, resolve_template_name(template_name))
|
235
237
|
end
|
236
238
|
|
237
239
|
# Call the named function, using all the context set up when we were
|
238
240
|
# created.
|
239
241
|
def call_function(function_name, args)
|
240
242
|
function_name = Saxon::QName.resolve(function_name).to_java
|
241
|
-
|
242
|
-
call_function_result(function_name, args)
|
243
|
+
transformation_invocation(:callFunction, function_name, function_args(args))
|
243
244
|
end
|
244
245
|
|
245
246
|
private
|
246
247
|
|
247
|
-
def
|
248
|
+
def transformation_invocation(invocation_method, *invocation_args)
|
248
249
|
set_opts!
|
249
|
-
|
250
|
-
Result.new(result_xdm_value(s9_transformer.send(*transformer_args)), s9_transformer)
|
250
|
+
XSLT::Invocation.new(s9_transformer, invocation_lambda(invocation_method, invocation_args), raw?)
|
251
251
|
end
|
252
252
|
|
253
|
-
def
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
)
|
253
|
+
def invocation_lambda(invocation_method, invocation_args)
|
254
|
+
->(destination) {
|
255
|
+
if destination.nil?
|
256
|
+
s9_transformer.send(invocation_method, *invocation_args)
|
257
|
+
else
|
258
|
+
s9_transformer.send(invocation_method, *invocation_args, destination.to_java)
|
259
|
+
end
|
260
|
+
}
|
262
261
|
end
|
263
262
|
|
264
263
|
def resolve_template_name(template_name)
|
265
|
-
return self.class.default_initial_template if template_name.nil?
|
266
|
-
Saxon::QName.resolve(template_name)
|
264
|
+
return self.class.default_initial_template.to_java if template_name.nil?
|
265
|
+
Saxon::QName.resolve(template_name).to_java
|
267
266
|
end
|
268
267
|
|
269
268
|
def function_args(args = [])
|
270
269
|
args.map { |val| Saxon::XDM.Value(val).to_java }.to_java(S9API::XdmValue)
|
271
270
|
end
|
272
271
|
|
273
|
-
def destination
|
274
|
-
@destination ||= begin
|
275
|
-
Saxon::S9API::XdmDestination.new unless raw?
|
276
|
-
end
|
277
|
-
end
|
278
|
-
|
279
272
|
def set_opts!
|
280
273
|
opts.each do |opt, value|
|
281
274
|
raise BadOptionError, opt unless VALID_OPTS.include?(opt)
|
@@ -312,24 +305,6 @@ module Saxon
|
|
312
305
|
end
|
313
306
|
end
|
314
307
|
|
315
|
-
# Represents the result of a transformation, providing a simple default
|
316
|
-
# serializer as well
|
317
|
-
class Result
|
318
|
-
attr_reader :xdm_value
|
319
|
-
|
320
|
-
# @api private
|
321
|
-
def initialize(xdm_value, s9_transformer)
|
322
|
-
@xdm_value, @s9_transformer = xdm_value, s9_transformer
|
323
|
-
end
|
324
|
-
|
325
|
-
# Serialize the result to a string using the options specified in
|
326
|
-
# +<xsl:output/>+ in the XSLT
|
327
|
-
def to_s
|
328
|
-
serializer = Serializer.new(@s9_transformer.newSerializer)
|
329
|
-
serializer.serialize(xdm_value.to_java)
|
330
|
-
end
|
331
|
-
end
|
332
|
-
|
333
308
|
# Raised if a bad option name is passed in the options hash to
|
334
309
|
# Executable#apply_templates et al
|
335
310
|
class BadOptionError < StandardError
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require_relative '../serializer'
|
2
|
+
require_relative '../xdm/value'
|
3
|
+
|
4
|
+
|
5
|
+
module Saxon
|
6
|
+
module XSLT
|
7
|
+
# Represents the invocation of a compiled and loaded transformation,
|
8
|
+
# providing an idiomatic way to send the result a transformation to a
|
9
|
+
# particular Destination, or to serialize it directly to a file, string, or
|
10
|
+
# IO.
|
11
|
+
class Invocation
|
12
|
+
attr_reader :s9_transformer, :invocation_lambda
|
13
|
+
|
14
|
+
# @api private
|
15
|
+
def initialize(s9_transformer, invocation_lambda, raw)
|
16
|
+
@s9_transformer, @invocation_lambda, @raw = s9_transformer, invocation_lambda, raw
|
17
|
+
end
|
18
|
+
|
19
|
+
# Serialize the result to a string using the options specified in
|
20
|
+
# +<xsl:output/>+ in the XSLT
|
21
|
+
#
|
22
|
+
# @return [String] the serialized result of the transformation
|
23
|
+
def to_s
|
24
|
+
serializer_destination.serialize
|
25
|
+
end
|
26
|
+
|
27
|
+
# Serialize the result of the transformation. When called with a
|
28
|
+
# block, the block will be executed via instance-exec so that output
|
29
|
+
# properties can be set, e.g.
|
30
|
+
#
|
31
|
+
# result.serialize {
|
32
|
+
# output_property[:indent] = 'yes'
|
33
|
+
# }
|
34
|
+
#
|
35
|
+
# @overload serialize(io)
|
36
|
+
# Serialize the transformation to an IO
|
37
|
+
# @param [File, IO] io The IO to serialize to
|
38
|
+
# @return [nil]
|
39
|
+
# @yield the passed block bound via instance-exec to the new serializer
|
40
|
+
# @overload serialize(path)
|
41
|
+
# Serialize the transformation to file <tt>path</tt>
|
42
|
+
# @param [String, Pathname] path The path of the file to serialize to
|
43
|
+
# @return [nil]
|
44
|
+
# @yield the passed block bound via instance-exec to the new serializer
|
45
|
+
# @overload serialize
|
46
|
+
# Serialize the transformation to a String
|
47
|
+
# @return [String] The serialized XdmValue
|
48
|
+
def serialize(path_or_io = nil, &block)
|
49
|
+
serializer_destination(&block).serialize(path_or_io)
|
50
|
+
end
|
51
|
+
|
52
|
+
# Return the result of the transformation as an XDM Value, either as it is
|
53
|
+
# returned (if the XSLT::Executable was created with :raw => true), or
|
54
|
+
# wrapped in a Document node and sequence normalized.
|
55
|
+
#
|
56
|
+
# @return [Saxon::XDM::Value] the XDM value returned by the transformation
|
57
|
+
def xdm_value
|
58
|
+
if raw?
|
59
|
+
XDM.Value(invocation_lambda.call(nil))
|
60
|
+
else
|
61
|
+
invocation_lambda.call(s9_xdm_destination)
|
62
|
+
XDM.Value(s9_xdm_destination.getXdmNode)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# Send the result of the transformation to the supplied Destination
|
67
|
+
#
|
68
|
+
# @param destination [net.sf.saxon.s9api.Destination] the Saxon
|
69
|
+
# destination to use
|
70
|
+
# @return [nil]
|
71
|
+
def to_destination(s9_destination)
|
72
|
+
invocation_lambda.call(s9_destination)
|
73
|
+
nil
|
74
|
+
end
|
75
|
+
|
76
|
+
# Whether the transformation was invoked as a 'raw' transformation, where
|
77
|
+
# an XDM Value result will be returned without being wrapped in a Document
|
78
|
+
# node, and without sequence normalization.
|
79
|
+
#
|
80
|
+
# @return [Boolean] whether the transformation was invoked 'raw' or not
|
81
|
+
def raw?
|
82
|
+
@raw
|
83
|
+
end
|
84
|
+
|
85
|
+
private
|
86
|
+
|
87
|
+
def serializer_destination(&block)
|
88
|
+
Saxon::Serializer::Destination.new(s9_transformer.newSerializer, invocation_lambda, &block)
|
89
|
+
end
|
90
|
+
|
91
|
+
def s9_xdm_destination
|
92
|
+
@s9_xdm_destination ||= Saxon::S9API::XdmDestination.new
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
data/saxon-rb.gemspec
CHANGED
@@ -34,6 +34,6 @@ It aims to provide an idiomatic Ruby wrapper around all of Saxon's features.}
|
|
34
34
|
spec.add_development_dependency 'addressable', '~> 2.4.0'
|
35
35
|
spec.add_development_dependency 'webmock', '~> 2.3.2'
|
36
36
|
spec.add_development_dependency 'yard', '~> 0.9.12'
|
37
|
-
spec.add_development_dependency 'simplecov', '~> 0.
|
37
|
+
spec.add_development_dependency 'simplecov', '~> 0.17.1'
|
38
38
|
spec.add_development_dependency 'rspec_junit_formatter'
|
39
39
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: saxon-rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Matt Patterson
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-02-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
@@ -127,7 +127,7 @@ dependencies:
|
|
127
127
|
requirements:
|
128
128
|
- - "~>"
|
129
129
|
- !ruby/object:Gem::Version
|
130
|
-
version:
|
130
|
+
version: 0.17.1
|
131
131
|
name: simplecov
|
132
132
|
prerelease: false
|
133
133
|
type: :development
|
@@ -135,7 +135,7 @@ dependencies:
|
|
135
135
|
requirements:
|
136
136
|
- - "~>"
|
137
137
|
- !ruby/object:Gem::Version
|
138
|
-
version:
|
138
|
+
version: 0.17.1
|
139
139
|
- !ruby/object:Gem::Dependency
|
140
140
|
requirement: !ruby/object:Gem::Requirement
|
141
141
|
requirements:
|
@@ -191,6 +191,9 @@ files:
|
|
191
191
|
- lib/saxon/s9api.rb
|
192
192
|
- lib/saxon/sequence_type.rb
|
193
193
|
- lib/saxon/serializer.rb
|
194
|
+
- lib/saxon/serializer/destination.rb
|
195
|
+
- lib/saxon/serializer/object.rb
|
196
|
+
- lib/saxon/serializer/output_properties.rb
|
194
197
|
- lib/saxon/source.rb
|
195
198
|
- lib/saxon/version.rb
|
196
199
|
- lib/saxon/xdm.rb
|
@@ -213,6 +216,7 @@ files:
|
|
213
216
|
- lib/saxon/xslt/compiler.rb
|
214
217
|
- lib/saxon/xslt/evaluation_context.rb
|
215
218
|
- lib/saxon/xslt/executable.rb
|
219
|
+
- lib/saxon/xslt/invocation.rb
|
216
220
|
- saxon-rb.gemspec
|
217
221
|
homepage: https://github.com/fidothe/saxon-rb
|
218
222
|
licenses:
|