rexslt 0.3.2 → 0.3.3
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.
- data/lib/rexslt.rb +65 -32
- metadata +2 -2
data/lib/rexslt.rb
CHANGED
@@ -34,7 +34,7 @@ class Rexslt
|
|
34
34
|
|
35
35
|
def initialize(xsl, xml)
|
36
36
|
super()
|
37
|
-
xslt_transform *[xsl, xml].map{|x| RXFHelper.read(x)}
|
37
|
+
xslt_transform *[xsl, xml].map{|x| RXFHelper.read(x).first}
|
38
38
|
end
|
39
39
|
|
40
40
|
def to_s()
|
@@ -47,21 +47,28 @@ class Rexslt
|
|
47
47
|
|
48
48
|
private
|
49
49
|
|
50
|
-
def
|
50
|
+
def xsl_apply_templates(element, x, doc_element, indent)
|
51
51
|
|
52
52
|
field = x.attributes[:select]
|
53
|
-
|
54
53
|
node = element.element field
|
55
54
|
|
56
55
|
return unless node
|
57
56
|
|
58
57
|
keypath = node.to_xpath :no_cond
|
59
58
|
matched_node = nil
|
59
|
+
|
60
|
+
# check for a nest <xsl:sort element
|
61
|
+
|
62
|
+
sort = x.element('xsl:sort')
|
63
|
+
if sort then
|
64
|
+
orderx = sort.attributes[:order]
|
65
|
+
sort_field = sort.attributes[:select]
|
66
|
+
end
|
60
67
|
|
61
68
|
raw_template = @templates.to_a.find do |raw_item, template|
|
62
69
|
|
63
70
|
item = raw_item.split('/')
|
64
|
-
|
71
|
+
|
65
72
|
if match? keypath, item then
|
66
73
|
matched_node = element.xpath field
|
67
74
|
true
|
@@ -78,9 +85,14 @@ class Rexslt
|
|
78
85
|
|
79
86
|
template_xpath, template = raw_template
|
80
87
|
|
81
|
-
|
82
|
-
|
83
|
-
|
88
|
+
if sort_field then
|
89
|
+
matched_node.sort_by{|x| x.element(sort_field).text}.each do |child_node|
|
90
|
+
read_node template, child_node, doc_element, indent
|
91
|
+
end
|
92
|
+
else
|
93
|
+
matched_node.each do |child_node|
|
94
|
+
read_node template, child_node, doc_element, indent
|
95
|
+
end
|
84
96
|
end
|
85
97
|
end
|
86
98
|
|
@@ -92,14 +104,14 @@ class Rexslt
|
|
92
104
|
end
|
93
105
|
|
94
106
|
|
95
|
-
def
|
107
|
+
def xsl_attribute(element, x, doc_element, indent)
|
96
108
|
|
97
109
|
name = x.attributes[:name]
|
98
110
|
value = x.text
|
99
111
|
doc_element.add_attribute name, value
|
100
112
|
end
|
101
113
|
|
102
|
-
def
|
114
|
+
def xsl_choose(element, x, doc_element, indent)
|
103
115
|
|
104
116
|
#get the when clause
|
105
117
|
|
@@ -123,7 +135,7 @@ class Rexslt
|
|
123
135
|
|
124
136
|
end
|
125
137
|
|
126
|
-
def
|
138
|
+
def xsl_copy_of(element, x, doc_element, indent)
|
127
139
|
|
128
140
|
indent_element(element, x, doc_element, indent, indent - 1) do
|
129
141
|
doc_element.add element
|
@@ -131,17 +143,18 @@ class Rexslt
|
|
131
143
|
|
132
144
|
end
|
133
145
|
|
134
|
-
def
|
146
|
+
def xsl_element(element, x, doc_element, indent)
|
135
147
|
|
136
148
|
indent_before(element, x, doc_element, indent + 1) if @indent == true
|
149
|
+
|
137
150
|
name = x.attributes[:name]
|
138
|
-
new_element = Rexle::Element.new
|
151
|
+
new_element = Rexle::Element.new(name).add_text(x.text)
|
139
152
|
doc_element.add new_element
|
140
153
|
read_node(x, element, new_element, indent)
|
141
154
|
indent_after(element, x, doc_element, indent) if @indent == true
|
142
155
|
end
|
143
156
|
|
144
|
-
def
|
157
|
+
def xsl_for_each(element, x, doc_element, indent)
|
145
158
|
|
146
159
|
xpath = x.attributes[:select]
|
147
160
|
nodes = element.match xpath
|
@@ -173,7 +186,7 @@ class Rexslt
|
|
173
186
|
|
174
187
|
end
|
175
188
|
|
176
|
-
def
|
189
|
+
def xsl_if(element, x, doc_element, indent)
|
177
190
|
|
178
191
|
condition = x.attributes[:test]
|
179
192
|
node = element.element, condition
|
@@ -193,6 +206,7 @@ class Rexslt
|
|
193
206
|
end
|
194
207
|
|
195
208
|
def indent_after(element, x, doc_element, prev_indent)
|
209
|
+
|
196
210
|
if @indent == true then
|
197
211
|
doc_element.add_text "\n" + ' ' * (prev_indent > 0 ? prev_indent - 1 : prev_indent)
|
198
212
|
end
|
@@ -206,7 +220,7 @@ class Rexslt
|
|
206
220
|
|
207
221
|
def padding(element,raw_indent, x)
|
208
222
|
# if there is any other elements in doc_element don't check for an indent!!!!
|
209
|
-
|
223
|
+
|
210
224
|
indent = 0
|
211
225
|
indent = raw_indent + 1 if element.texts.length <= 0
|
212
226
|
x.to_s.strip.length > 0 ? ' ' * indent : ''
|
@@ -219,7 +233,6 @@ class Rexslt
|
|
219
233
|
template_node.each do |x|
|
220
234
|
method(procs[x.class.to_s]).call(element, x, doc_element, indent)
|
221
235
|
end
|
222
|
-
|
223
236
|
end
|
224
237
|
|
225
238
|
# element: xml source element, x: xsl element, doc_element: current destination xml element
|
@@ -234,8 +247,8 @@ class Rexslt
|
|
234
247
|
|
235
248
|
def read_raw_element(element, x, doc_element, indent)
|
236
249
|
|
237
|
-
method_name = x.name.gsub(
|
238
|
-
|
250
|
+
method_name = x.name.gsub(/[:-]/,'_').to_sym
|
251
|
+
|
239
252
|
if @xsl_methods.include? method_name then
|
240
253
|
method(method_name).call(element, x, doc_element, indent)
|
241
254
|
else
|
@@ -243,17 +256,29 @@ class Rexslt
|
|
243
256
|
previous_indent = indent
|
244
257
|
la = x.name
|
245
258
|
|
246
|
-
|
247
259
|
if x.children.length > 0 then
|
248
260
|
|
249
261
|
new_indent = indent + 1
|
250
262
|
new_element = x.clone
|
251
263
|
|
264
|
+
new_element2 = new_element.deep_clone
|
265
|
+
new_element2.attributes.each do |k,v|
|
266
|
+
|
267
|
+
if v[/{/] then
|
268
|
+
|
269
|
+
v.gsub!(/(\{[^\}]+\})/) do |x2|
|
270
|
+
element.text(x2[/\{([^\}]+)\}/,1]).clone
|
271
|
+
end
|
272
|
+
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
252
276
|
indent_before(element, x, doc_element, new_indent) if @indent == true
|
253
277
|
|
254
|
-
|
278
|
+
#jr070412 new_element.text = new_element.text.strip if @indent == false
|
279
|
+
doc_element.add new_element2
|
255
280
|
|
256
|
-
read_node(x, element,
|
281
|
+
read_node(x, element, new_element2, new_indent)
|
257
282
|
indent_after(element, x, doc_element, previous_indent) if @indent == true
|
258
283
|
|
259
284
|
else
|
@@ -273,13 +298,14 @@ class Rexslt
|
|
273
298
|
end
|
274
299
|
end
|
275
300
|
|
276
|
-
def
|
301
|
+
def xsl_text(element, x, doc_element, indent)
|
277
302
|
val = @indent == true ? padding(doc_element, indent, x) : ''
|
278
303
|
val += x.text
|
279
304
|
doc_element.add_element val
|
280
305
|
end
|
281
306
|
|
282
|
-
def
|
307
|
+
def xsl_value_of(element, x, doc_element, indent)
|
308
|
+
|
283
309
|
field = x.attributes[:select]
|
284
310
|
o = field == '.' ? element.text : element.text(field)
|
285
311
|
doc_element.add_element o.to_s
|
@@ -294,10 +320,11 @@ class Rexslt
|
|
294
320
|
indent = 0
|
295
321
|
|
296
322
|
previous_indent = 0
|
297
|
-
@xsl_methods = [:
|
298
|
-
:
|
323
|
+
@xsl_methods = [:'xsl_apply_templates', :'xsl_value_of', :'xsl_element', :'xsl_if', :'xsl_choose',
|
324
|
+
:'xsl_when', :'xsl_copy_of', :'xsl_attribute', :'xsl_for_each', :'xsl_text']
|
299
325
|
|
300
|
-
strip_space = @doc_xsl.element "xsl:strip-space/attribute::elements"
|
326
|
+
strip_space = @doc_xsl.root.element "xsl:strip-space/attribute::elements"
|
327
|
+
|
301
328
|
if strip_space then
|
302
329
|
elements = strip_space.value
|
303
330
|
elements.split.each do |element|
|
@@ -306,22 +333,28 @@ class Rexslt
|
|
306
333
|
a.each {|node| node.parent.delete node}
|
307
334
|
end
|
308
335
|
end
|
309
|
-
|
310
|
-
h = @doc_xsl.xpath("xsl:output/attribute::*").inject({})\
|
336
|
+
|
337
|
+
h = @doc_xsl.root.xpath("xsl:output/attribute::*").inject({})\
|
311
338
|
{|r,x| r.merge(x.name.to_sym => x.value)}
|
312
339
|
|
313
|
-
@indent =
|
340
|
+
@indent = (h and h[:indent] == 'yes') ? true : false
|
314
341
|
|
315
342
|
# fetch the templates
|
316
|
-
|
317
|
-
|
343
|
+
#puts "Rexle:Version: " + Rexle.version
|
344
|
+
|
345
|
+
@templates = @doc_xsl.root.xpath('xsl:template').inject({}) do |r,x|
|
346
|
+
r.merge(x.attributes[:match] || x.attributes[:select] => x)
|
318
347
|
end
|
319
348
|
|
320
349
|
# using the 1st template
|
321
350
|
xpath = String.new @templates.to_a[0][0]
|
322
351
|
|
323
352
|
if doc_xml.root.name == xpath then
|
324
|
-
read_node(@templates.to_a[0][-1], doc_xml, @doc.root, indent)
|
353
|
+
read_node(@templates.to_a[0][-1], doc_xml.element(xpath), @doc.root, indent)
|
354
|
+
else
|
355
|
+
# use this template
|
356
|
+
node = doc_xml.root.element(xpath)
|
357
|
+
read_node(@templates.to_a[0][-1], doc_xml, node, indent)
|
325
358
|
end
|
326
359
|
|
327
360
|
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: rexslt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.3.
|
5
|
+
version: 0.3.3
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- James Robertson
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2012-
|
13
|
+
date: 2012-04-08 00:00:00 +01:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|