saxon-xslt 0.8.1-java → 0.8.2-java
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +21 -6
- data/lib/saxon/loader.rb +27 -19
- data/lib/saxon/xslt.rb +20 -7
- data/lib/saxon/xslt/version.rb +1 -1
- data/spec/fixtures/params-eg.xsl +5 -1
- data/spec/saxon/xslt_spec.rb +14 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 30d7250ed416d25ff3453a50b044a4c9fb5f9616
|
4
|
+
data.tar.gz: 8510336f672dfa823ac396c433b7427c2b234bc8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e2cf95510646c2b98f558ee08f134e7069a9c6e9362f62fa0cc2c27e0ccedeb58f1c6ff70ac8a698700b441b3f71560ef676362472f9305afae84d52011a1d37
|
7
|
+
data.tar.gz: 4c01b6dceb736867f58ac4498e8ad7f6afdedf3b8e55979c41bbe2fcb5a794d504f747731676a2cac0818f7278da2fa881d8667ee0c013e8311e69e8bfd84f36
|
data/README.md
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# Saxon::Xslt
|
2
2
|
|
3
|
-
Wraps the Saxon 9
|
3
|
+
Wraps the Saxon 9 XSLT processor Java API so it's easy to use from your JRuby project, with an API modelled on Nokogiri's.
|
4
4
|
|
5
|
-
Saxon
|
5
|
+
Saxon is a Java library, so saxon-xslt only runs under JRuby.
|
6
6
|
|
7
7
|
[](http://badge.fury.io/rb/saxon-xslt)
|
8
8
|
[](https://travis-ci.org/fidothe/saxon-xslt)
|
@@ -54,16 +54,13 @@ For those familiar with the Saxon API, names are passed directly to the QName co
|
|
54
54
|
Values are evaluated as XPath expressions in context of the document being transformed; this means
|
55
55
|
that, to pass a string, you must pass an XPath that resolves to a string, i.e. "'You must wrap strings in quotes'"
|
56
56
|
|
57
|
-
## Saxon version
|
58
|
-
`saxon-xslt` 0.7 includes Saxon HE 9.5.1.7
|
59
|
-
|
60
57
|
## Differences between Saxon and Nokogiri
|
61
58
|
|
62
59
|
Saxon uses a `Processor` class as its central object: it holds configuration information and acts as a Factory for creating documents or XSLT stylesheet compilers. Unless you need to tweak the config you don't need to worry about this – `saxon-xslt` creates a shared instance behind the scenes when you call `Saxon.XSLT` or `Saxon.XML`. If you need to change the configuration you can create your own instance of `Saxon::Processor` and pass it an open `File` pointing at a Saxon configuration file. (See http://www.saxonica.com/documentation/index.html#!configuration/configuration-file for details of the configuration file.) Once you have a `Saxon::Processor` instance you can call the `XML` and `XSLT` methods on it directly:
|
63
60
|
|
64
61
|
```ruby
|
65
62
|
require 'saxon-xslt'
|
66
|
-
processor = Saxon::Processor.
|
63
|
+
processor = Saxon::Processor.create(File.open('/path/to/config.xml'))
|
67
64
|
transformer = processor.XSLT(File.open('/path/to/your.xsl'))
|
68
65
|
input = processor.XML(File.open('/path/to/your.xml'))
|
69
66
|
output = transformer.transform(input)
|
@@ -88,6 +85,24 @@ xslt = Saxon.XSLT("<xsl:stylesheet>...</xsl:stylesheet>",
|
|
88
85
|
|
89
86
|
So, if you have other XSLT stylesheets in `/path/to/resources/` then your dynamically generated XSLT can refer to them with import statements like `<xsl:import href="other_stylesheet.xsl"/>`.
|
90
87
|
|
88
|
+
## Saxon versions (HE, PE, EE)
|
89
|
+
`saxon-xslt` 0.8.2 includes Saxon HE 9.8.0.6 - you don't need to download Saxon yourself. Saxon PE and EE are paid-for versions with more features.
|
90
|
+
|
91
|
+
If you have a license for Saxon PE or EE, then you can use them by passing their location and the location of your `.lic` license file in as follows:
|
92
|
+
|
93
|
+
```ruby
|
94
|
+
require 'saxon-xslt'
|
95
|
+
|
96
|
+
# Tell us where your Saxon Jars are.
|
97
|
+
Saxon::Loader.load!('/path/to/dir/containing/saxon-jars')
|
98
|
+
# Create a licensed Configuration object
|
99
|
+
config = Saxon::Configuration.create_licensed('/path/to/saxon-license.lic')
|
100
|
+
# Create a Processor from your licensed Configuration
|
101
|
+
processor = Saxon::Processor.create(config)
|
102
|
+
# Go!
|
103
|
+
transformer = processor.XSLT(File.open('/path/to/your.xsl'))
|
104
|
+
```
|
105
|
+
|
91
106
|
## Contributing
|
92
107
|
|
93
108
|
1. Fork it
|
data/lib/saxon/loader.rb
CHANGED
@@ -9,6 +9,8 @@ module Saxon
|
|
9
9
|
module Loader
|
10
10
|
LOAD_SEMAPHORE = Mutex.new
|
11
11
|
|
12
|
+
# Error raised if Saxon::Loader.load! is called but the path handed
|
13
|
+
# in does not exist or is not a directory
|
12
14
|
class NoJarsError < StandardError
|
13
15
|
def initialize(path)
|
14
16
|
@path = path
|
@@ -19,6 +21,8 @@ module Saxon
|
|
19
21
|
end
|
20
22
|
end
|
21
23
|
|
24
|
+
# Error raised if Saxon::Loader.load! is called but the path handed
|
25
|
+
# in does not contain the Saxon .jars
|
22
26
|
class MissingJarError < StandardError
|
23
27
|
def initialize(path)
|
24
28
|
@path = path
|
@@ -29,25 +33,10 @@ module Saxon
|
|
29
33
|
end
|
30
34
|
end
|
31
35
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
def self.extra_jars(path)
|
37
|
-
optional = ['saxon9-unpack.jar', 'saxon9-sql.jar'].map { |jar| path.join(jar) }.select { |jar| jar.file? }
|
38
|
-
icu = path.children.find { |jar| jar.extname == '.jar' && !jar.basename.to_s.match(/^saxon-icu|^icu4j/).nil? }
|
39
|
-
([icu] + optional).compact
|
40
|
-
end
|
41
|
-
|
42
|
-
def self.jars_not_on_classpath?
|
43
|
-
begin
|
44
|
-
Java::net.sf.saxon.s9api.Processor
|
45
|
-
false
|
46
|
-
rescue
|
47
|
-
true
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
36
|
+
# @param saxon_home [String, Pathname] the path to the dir containing
|
37
|
+
# Saxon's .jars. Defaults to the vendored Saxon HE
|
38
|
+
# @return [true, false] Returns true if Saxon had not been loaded and
|
39
|
+
# is now, and false if Saxon was already loaded
|
51
40
|
def self.load!(saxon_home = File.expand_path('../../../vendor/saxonica', __FILE__))
|
52
41
|
return false if @saxon_loaded
|
53
42
|
LOAD_SEMAPHORE.synchronize do
|
@@ -73,6 +62,25 @@ module Saxon
|
|
73
62
|
|
74
63
|
private
|
75
64
|
|
65
|
+
def self.main_jar(path)
|
66
|
+
['saxon9he.jar', 'saxon9pe.jar', 'saxon9ee.jar'].map { |jar| path.join(jar) }.find { |jar| jar.file? }
|
67
|
+
end
|
68
|
+
|
69
|
+
def self.extra_jars(path)
|
70
|
+
optional = ['saxon9-unpack.jar', 'saxon9-sql.jar'].map { |jar| path.join(jar) }.select { |jar| jar.file? }
|
71
|
+
icu = path.children.find { |jar| jar.extname == '.jar' && !jar.basename.to_s.match(/^saxon-icu|^icu4j/).nil? }
|
72
|
+
([icu] + optional).compact
|
73
|
+
end
|
74
|
+
|
75
|
+
def self.jars_not_on_classpath?
|
76
|
+
begin
|
77
|
+
Java::net.sf.saxon.s9api.Processor
|
78
|
+
false
|
79
|
+
rescue
|
80
|
+
true
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
76
84
|
def self.add_jars_to_classpath!(saxon_home, jars)
|
77
85
|
jars.each do |jar|
|
78
86
|
$CLASSPATH << jar.to_s
|
data/lib/saxon/xslt.rb
CHANGED
@@ -91,17 +91,30 @@ module Saxon
|
|
91
91
|
|
92
92
|
private
|
93
93
|
|
94
|
-
def
|
94
|
+
def resolve_q_name(q_name_or_string)
|
95
|
+
case q_name_or_string
|
96
|
+
when S9API::QName
|
97
|
+
q_name_or_string
|
98
|
+
else
|
99
|
+
S9API::QName.new(q_name_or_string.to_s)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def params_as_kv_pairs(params)
|
95
104
|
case params
|
96
105
|
when Hash
|
97
|
-
params
|
98
|
-
transformer.setParameter(S9API::QName.new(k.to_s), document.xpath(v))
|
99
|
-
end
|
106
|
+
params
|
100
107
|
when Array
|
101
|
-
params.each_slice(2)
|
108
|
+
params.each_slice(2).map { |k,v|
|
102
109
|
raise ArgumentError.new("Odd number of values passed as params: #{params}") if v.nil?
|
103
|
-
|
104
|
-
|
110
|
+
[k, v]
|
111
|
+
}
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def set_params(transformer, document, params)
|
116
|
+
params_as_kv_pairs(params).each do |k,v|
|
117
|
+
transformer.setParameter(resolve_q_name(k), document.xpath(v))
|
105
118
|
end
|
106
119
|
end
|
107
120
|
end
|
data/lib/saxon/xslt/version.rb
CHANGED
data/spec/fixtures/params-eg.xsl
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
-
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
|
2
|
+
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:eg="http://example.org/ns" version="2.0" exclude-result-prefixes="eg">
|
3
3
|
<xsl:param name="testparam">default</xsl:param>
|
4
|
+
<xsl:param name="eg:qname-param" select="false()"/>
|
4
5
|
<xsl:template match="input">
|
5
6
|
<xsl:choose>
|
6
7
|
<xsl:when test="$testparam = 'default'">
|
@@ -17,5 +18,8 @@
|
|
17
18
|
</output>
|
18
19
|
</xsl:otherwise>
|
19
20
|
</xsl:choose>
|
21
|
+
<xsl:if test="$eg:qname-param">
|
22
|
+
<qname-param/>
|
23
|
+
</xsl:if>
|
20
24
|
</xsl:template>
|
21
25
|
</xsl:stylesheet>
|
data/spec/saxon/xslt_spec.rb
CHANGED
@@ -101,7 +101,20 @@ describe Saxon::XSLT do
|
|
101
101
|
let(:result) { xsl.transform(xml, ["testparam", "local-name(/input)"]) }
|
102
102
|
|
103
103
|
it "should contain the name of the tag" do
|
104
|
-
|
104
|
+
expect(result.to_s.strip).to include('Select works')
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
context "passing a QName-using param" do
|
109
|
+
let(:result) { xsl.transform(xml, {Saxon::S9API::QName.fromClarkName('{http://example.org/ns}qname-param') => "true()"}) }
|
110
|
+
|
111
|
+
it "should not contain the qname-related output when the param isn't passed" do
|
112
|
+
result = xsl.transform(xml)
|
113
|
+
expect(result.to_s.strip).to_not include('<qname-param/>')
|
114
|
+
end
|
115
|
+
|
116
|
+
it "should contain the qname-related outputtag" do
|
117
|
+
expect(result.to_s.strip).to include('<qname-param/>')
|
105
118
|
end
|
106
119
|
end
|
107
120
|
end
|
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.8.
|
4
|
+
version: 0.8.2
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Matt Patterson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-01-
|
11
|
+
date: 2018-01-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|