saxon-xslt 0.5.1-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 +18 -1
- data/lib/saxon/s9api.rb +1 -0
- data/lib/saxon/xml.rb +8 -0
- data/lib/saxon/xslt/version.rb +1 -1
- data/lib/saxon/xslt.rb +60 -3
- data/spec/fixtures/eg.xsl +7 -6
- data/spec/fixtures/params-eg.xsl +21 -0
- data/spec/saxon/xslt_spec.rb +63 -1
- data/vendor/saxonica/saxon9-unpack.jar +0 -0
- data/vendor/saxonica/saxon9-xqj.jar +0 -0
- data/vendor/saxonica/saxon9he.jar +0 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: af91b7c69d754725f26d768b1866057099101db0
|
4
|
+
data.tar.gz: 808008c7ca54ec9914f6317664977bb0f9ead2c3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eadf0c7d72d149475479e11845ae9618506f33741b15c4878ff9f44c2a1f5b0a2ae3b186db6cebbfc5258dbe7ba1718152dd9c80c0a02bcda98c501665fff3bb
|
7
|
+
data.tar.gz: c350adfe866ea020afa4b81b3e7a949d2c18d8942fb40b8d3063ca6c29ecbb75151f8552e968a088e360405ceed653e13819f9b7a947fd91e2639089ba8d57c6
|
data/README.md
CHANGED
@@ -35,8 +35,25 @@ input = Saxon.XML(File.open('/path/to/your.xml'))
|
|
35
35
|
output = transformer.transform(input)
|
36
36
|
```
|
37
37
|
|
38
|
+
XSL parameters can be passed to #transform as a flat array of name, value pairs, or as a hash, e.g.
|
39
|
+
|
40
|
+
```ruby
|
41
|
+
output = transformer.transform(input, ["my-param", "'my-value'",
|
42
|
+
"my-other-param", "/take-from@id"])
|
43
|
+
|
44
|
+
# or
|
45
|
+
|
46
|
+
output = transformer.transform(input, {"my-param" => "'my-value'",
|
47
|
+
"my-other-param" => "/take-from@id"})
|
48
|
+
```
|
49
|
+
|
50
|
+
For those familiar with the Saxon API, names are passed directly to the QName constructor.
|
51
|
+
|
52
|
+
Values are evaluated as XPath expressions in context of the document being transformed; this means
|
53
|
+
that, to pass a string, you must pass an XPath that resolves to a string, i.e. "'You must wrap strings in quotes'"
|
54
|
+
|
38
55
|
## Saxon version
|
39
|
-
`saxon-xslt` 0.
|
56
|
+
`saxon-xslt` 0.6 includes Saxon HE 9.5.1.7
|
40
57
|
|
41
58
|
## Differences between Saxon and Nokogiri
|
42
59
|
|
data/lib/saxon/s9api.rb
CHANGED
data/lib/saxon/xml.rb
CHANGED
@@ -14,6 +14,7 @@ module Saxon
|
|
14
14
|
module XML
|
15
15
|
# Parse an XML File or String into a Document object
|
16
16
|
class Document
|
17
|
+
# @api private
|
17
18
|
# @param [Saxon::Processor] processor The processor object which should
|
18
19
|
# be used to build the document
|
19
20
|
# @param [String, File, IO] string_or_io The input XML
|
@@ -26,6 +27,13 @@ module Saxon
|
|
26
27
|
new(xdm_document)
|
27
28
|
end
|
28
29
|
|
30
|
+
# @param [String] expr The XPath expression to evaluate
|
31
|
+
# @return [net.sf.saxon.s9api.XdmValue] return the value, node, or
|
32
|
+
# nodes selected
|
33
|
+
def xpath(expr)
|
34
|
+
processor.to_java.new_xpath_compiler.evaluate(expr, @xdm_document)
|
35
|
+
end
|
36
|
+
|
29
37
|
# @api private
|
30
38
|
def initialize(xdm_document)
|
31
39
|
@xdm_document = xdm_document
|
data/lib/saxon/xslt/version.rb
CHANGED
data/lib/saxon/xslt.rb
CHANGED
@@ -15,6 +15,7 @@ module Saxon
|
|
15
15
|
module XSLT
|
16
16
|
# a Stylesheet transforms input (XML) into output
|
17
17
|
class Stylesheet
|
18
|
+
# @api private
|
18
19
|
# @param processor [Saxon::Processor] the Saxon processor object
|
19
20
|
# @param string_or_io [File, IO, String] the input XSLT
|
20
21
|
# @param opts [Hash] Stylesheet and input options
|
@@ -24,6 +25,15 @@ module Saxon
|
|
24
25
|
new(source)
|
25
26
|
end
|
26
27
|
|
28
|
+
# Compile a stylesheet from an existing Saxon::XML instance of an XSLT
|
29
|
+
# source
|
30
|
+
#
|
31
|
+
# @param [Saxon::XML::Document] source the input XSLT as an XML document
|
32
|
+
# @return [Saxon::XSLT::Stylesheet] the compiled XSLT stylesheet
|
33
|
+
def self.parse_stylesheet_doc(document)
|
34
|
+
new(document)
|
35
|
+
end
|
36
|
+
|
27
37
|
# @param [Saxon::XML::Document] source the input XSLT as an XML document
|
28
38
|
def initialize(source)
|
29
39
|
processor = source.processor
|
@@ -32,17 +42,64 @@ module Saxon
|
|
32
42
|
end
|
33
43
|
|
34
44
|
# Transform an input document
|
35
|
-
#
|
45
|
+
#
|
46
|
+
# To pass global parameters you can pass a hash with parameter names as
|
47
|
+
# keys and values as XPath expressions as values: to pass a string value,
|
48
|
+
# you need to pass it quoted: `"'string'"`. An unquoted string is an
|
49
|
+
# XPath reference into the document being transformed.
|
50
|
+
#
|
51
|
+
# @param [Saxon::XML::Document] document the XML Document object to
|
36
52
|
# transform
|
37
|
-
# @
|
38
|
-
|
53
|
+
# @param params [Hash,Array] xsl params to set in the xsl document
|
54
|
+
# @return [Saxon::XML::Document] the transformed XML Document
|
55
|
+
def transform(document, params = {})
|
39
56
|
output = S9API::XdmDestination.new
|
40
57
|
transformer = @xslt.load
|
41
58
|
transformer.setInitialContextNode(document.to_java)
|
42
59
|
transformer.setDestination(output)
|
60
|
+
set_params(transformer, document, params)
|
43
61
|
transformer.transform
|
44
62
|
Saxon::XML::Document.new(output.getXdmNode)
|
45
63
|
end
|
64
|
+
|
65
|
+
# Transform an input document and return the result as a string.
|
66
|
+
#
|
67
|
+
# See #transform for details of params handling
|
68
|
+
# @param [Saxon::XML::Document] document the XML Document object to
|
69
|
+
# transform
|
70
|
+
# @param params [Hash,Array] xsl params to set in the xsl document
|
71
|
+
# @return [String] the transformed XML Document serialised to a string
|
72
|
+
def apply_to(document, params = {})
|
73
|
+
serialize(transform(document, params))
|
74
|
+
end
|
75
|
+
|
76
|
+
# Serialise a document to a string
|
77
|
+
#
|
78
|
+
# Not the most useful serialiser in the world. Provided for Nokogiri API
|
79
|
+
# compatibility
|
80
|
+
#
|
81
|
+
# @param [Saxon::XML::Document] document the XML Document object to
|
82
|
+
# serialise
|
83
|
+
# @return [String] the XML Document serialised to a string
|
84
|
+
def serialize(document)
|
85
|
+
document.to_s
|
86
|
+
end
|
87
|
+
|
88
|
+
private
|
89
|
+
|
90
|
+
def set_params(transformer, document, params)
|
91
|
+
case params
|
92
|
+
when Hash
|
93
|
+
params.each do |k,v|
|
94
|
+
transformer.setParameter(S9API::QName.new(k), document.xpath(v))
|
95
|
+
end
|
96
|
+
when Array
|
97
|
+
params.each_slice(2) do |k,v|
|
98
|
+
raise ArgumentError.new("Odd number of values passed as params: #{params}") if v.nil?
|
99
|
+
transformer.setParameter(S9API::QName.new(k), document.xpath(v))
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
46
103
|
end
|
47
104
|
end
|
48
105
|
end
|
data/spec/fixtures/eg.xsl
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
2
2
|
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
3
|
+
<xsl:param name="testparam">default</xsl:param>
|
4
|
+
<xsl:template match="input">
|
5
|
+
<output/>
|
6
|
+
</xsl:template>
|
7
|
+
<xsl:template match="output">
|
8
|
+
<piped/>
|
9
|
+
</xsl:template>
|
9
10
|
</xsl:stylesheet>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
|
3
|
+
<xsl:param name="testparam">default</xsl:param>
|
4
|
+
<xsl:template match="input">
|
5
|
+
<xsl:choose>
|
6
|
+
<xsl:when test="$testparam = 'default'">
|
7
|
+
<output/>
|
8
|
+
</xsl:when>
|
9
|
+
<xsl:when test="$testparam = 'input'">
|
10
|
+
<output>
|
11
|
+
Select works
|
12
|
+
</output>
|
13
|
+
</xsl:when>
|
14
|
+
<xsl:otherwise>
|
15
|
+
<output>
|
16
|
+
<xsl:value-of select="$testparam" />
|
17
|
+
</output>
|
18
|
+
</xsl:otherwise>
|
19
|
+
</xsl:choose>
|
20
|
+
</xsl:template>
|
21
|
+
</xsl:stylesheet>
|
data/spec/saxon/xslt_spec.rb
CHANGED
@@ -35,6 +35,12 @@ describe Saxon::XSLT do
|
|
35
35
|
xslt = Saxon::XSLT::Stylesheet.new(input)
|
36
36
|
expect(xslt).to respond_to(:transform)
|
37
37
|
end
|
38
|
+
|
39
|
+
it "provides the parse_stylesheet_doc method to compile from a Saxon::XML::Document" do
|
40
|
+
input = processor.XML(File.open(fixture_path('eg.xsl')))
|
41
|
+
xslt = Saxon::XSLT::Stylesheet.parse_stylesheet_doc(input)
|
42
|
+
expect(xslt).to respond_to(:transform)
|
43
|
+
end
|
38
44
|
end
|
39
45
|
|
40
46
|
context "transforming a document" do
|
@@ -57,6 +63,63 @@ describe Saxon::XSLT do
|
|
57
63
|
expect(xsl.transform(result).to_s.strip).to eq('<piped/>')
|
58
64
|
end
|
59
65
|
end
|
66
|
+
|
67
|
+
context "when passing global parameters at transform time" do
|
68
|
+
let(:xsl) { processor.XSLT(File.open(fixture_path('params-eg.xsl'))) }
|
69
|
+
|
70
|
+
context "using hash params" do
|
71
|
+
let(:result) { xsl.transform(xml, {"testparam" => "'non-default'"}) }
|
72
|
+
|
73
|
+
it "contains the parameter value string" do
|
74
|
+
expect(result.to_s.strip).to include("non-default")
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
context "using array params" do
|
79
|
+
let(:result) { xsl.transform(xml, ["testparam", "'non-default'"]) }
|
80
|
+
|
81
|
+
it "contains the parameter value string" do
|
82
|
+
expect(result.to_s.strip).to include("non-default")
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
context "using malformed array params" do
|
87
|
+
it "should raise ArgumentError" do
|
88
|
+
expect{xsl.transform(xml, ["testparam", "'non-default'", "'wrongo'"])}.to raise_error(ArgumentError)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
context "using a selection from the input" do
|
93
|
+
let(:result) { xsl.transform(xml, ["testparam", "local-name(/input)"]) }
|
94
|
+
|
95
|
+
it "should contain the name of the tag" do
|
96
|
+
expect(result.to_s.strip).to include('Select works')
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
describe "applying a stylesheet to a document and returning a serialised XML string" do
|
104
|
+
let(:xsl) { processor.XSLT(File.open(fixture_path('eg.xsl'))) }
|
105
|
+
let(:xml) { processor.XML(File.open(fixture_path('eg.xml'))) }
|
106
|
+
|
107
|
+
it "returns XML as a string" do
|
108
|
+
result = xsl.apply_to(xml)
|
109
|
+
|
110
|
+
expect(result).to match(/<output\/>/)
|
111
|
+
end
|
112
|
+
|
113
|
+
it "correctly invokes transform" do
|
114
|
+
expect(xsl).to receive(:transform).with(xml, {})
|
115
|
+
|
116
|
+
xsl.apply_to(xml)
|
117
|
+
end
|
118
|
+
|
119
|
+
it "correctly passes params through to transform" do
|
120
|
+
expect(xsl).to receive(:transform).with(xml, {"param" => "'value'"})
|
121
|
+
|
122
|
+
xsl.apply_to(xml, {"param" => "'value'"})
|
60
123
|
end
|
61
124
|
end
|
62
125
|
|
@@ -68,4 +131,3 @@ describe Saxon::XSLT do
|
|
68
131
|
end
|
69
132
|
end
|
70
133
|
end
|
71
|
-
|
Binary file
|
Binary file
|
Binary file
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: saxon-xslt
|
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: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-08-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
@@ -109,6 +109,7 @@ files:
|
|
109
109
|
- spec/fixtures/config.xml
|
110
110
|
- spec/fixtures/eg.xml
|
111
111
|
- spec/fixtures/eg.xsl
|
112
|
+
- spec/fixtures/params-eg.xsl
|
112
113
|
- spec/fixtures/simple-xsl-import.xsl
|
113
114
|
- spec/saxon/processor_spec.rb
|
114
115
|
- spec/saxon/source_helper_spec.rb
|
@@ -150,6 +151,7 @@ test_files:
|
|
150
151
|
- spec/fixtures/config.xml
|
151
152
|
- spec/fixtures/eg.xml
|
152
153
|
- spec/fixtures/eg.xsl
|
154
|
+
- spec/fixtures/params-eg.xsl
|
153
155
|
- spec/fixtures/simple-xsl-import.xsl
|
154
156
|
- spec/saxon/processor_spec.rb
|
155
157
|
- spec/saxon/source_helper_spec.rb
|