rexslt 0.3.10 → 0.4.00
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 +61 -47
- metadata +3 -3
data/lib/rexslt.rb
CHANGED
|
@@ -38,8 +38,8 @@ class Rexslt
|
|
|
38
38
|
xslt_transform(*[xsl, xml].map{|x| RXFHelper.read(x).first}, custom_params)
|
|
39
39
|
end
|
|
40
40
|
|
|
41
|
-
def to_s(options={})
|
|
42
|
-
@doc.to_s(options)
|
|
41
|
+
def to_s(options={})
|
|
42
|
+
@doc.to_s(options).sub('<root>','').sub(/<\/root>$/m,'')
|
|
43
43
|
end
|
|
44
44
|
|
|
45
45
|
def to_doc(); @doc; end
|
|
@@ -49,7 +49,7 @@ class Rexslt
|
|
|
49
49
|
private
|
|
50
50
|
|
|
51
51
|
def xsl_apply_templates(element, x, doc_element, indent, i)
|
|
52
|
-
|
|
52
|
+
|
|
53
53
|
field = x.attributes[:select]
|
|
54
54
|
node = element.element field
|
|
55
55
|
return unless node
|
|
@@ -71,7 +71,6 @@ class Rexslt
|
|
|
71
71
|
|
|
72
72
|
raw_template = @templates.to_a.find do |raw_item, template|
|
|
73
73
|
|
|
74
|
-
|
|
75
74
|
item = raw_item.split('/')
|
|
76
75
|
|
|
77
76
|
if match? keypath, item then
|
|
@@ -150,7 +149,7 @@ class Rexslt
|
|
|
150
149
|
|
|
151
150
|
condition = xsl_node.attributes[:test]
|
|
152
151
|
node = element.element condition
|
|
153
|
-
|
|
152
|
+
|
|
154
153
|
if node and node == true
|
|
155
154
|
read_node(xsl_node, element, doc_element, indent, i)
|
|
156
155
|
true
|
|
@@ -159,20 +158,26 @@ class Rexslt
|
|
|
159
158
|
end
|
|
160
159
|
end
|
|
161
160
|
|
|
161
|
+
|
|
162
162
|
unless r.any? then
|
|
163
|
+
|
|
163
164
|
node = x.element 'xsl:otherwise'
|
|
164
|
-
|
|
165
|
+
|
|
166
|
+
otherwise = node.element("xsl:otherwise")
|
|
167
|
+
if otherwise then
|
|
168
|
+
read_node(otherwise, element, doc_element, indent) if node
|
|
169
|
+
end
|
|
165
170
|
end
|
|
166
171
|
|
|
167
172
|
end
|
|
168
173
|
|
|
169
174
|
def xsl_copy_of(element, x, doc_element, indent, i)
|
|
170
|
-
indent = 1 unless indent
|
|
171
|
-
indent_element(element, x, doc_element, indent, indent - 1) do
|
|
175
|
+
#jr251012 indent = 1 unless indent
|
|
176
|
+
#jr251012 indent_element(element, x, doc_element, indent, indent - 1) do
|
|
172
177
|
field = x.attributes[:select]
|
|
173
178
|
child = element.element(field)
|
|
174
179
|
doc_element.add child
|
|
175
|
-
end
|
|
180
|
+
#jr251012 end
|
|
176
181
|
|
|
177
182
|
end
|
|
178
183
|
|
|
@@ -185,7 +190,8 @@ class Rexslt
|
|
|
185
190
|
name = element.element("name()")
|
|
186
191
|
end
|
|
187
192
|
|
|
188
|
-
new_element = Rexle::Element.new(name).add_text(x.value.strip)
|
|
193
|
+
new_element = Rexle::Element.new(name) # .add_text(x.value.strip)
|
|
194
|
+
|
|
189
195
|
doc_element.add new_element
|
|
190
196
|
read_node(x, element, new_element, indent, i)
|
|
191
197
|
indent_after(element, x, doc_element, indent, i) if @indent == true
|
|
@@ -232,11 +238,10 @@ class Rexslt
|
|
|
232
238
|
def xsl_if(element, x, doc_element, indent, i=0)
|
|
233
239
|
|
|
234
240
|
condition = x.attributes[:test].gsub('position()',i.to_s).gsub('<','<').gsub('>','>')
|
|
235
|
-
result = element.element condition
|
|
241
|
+
result = element.element condition
|
|
236
242
|
|
|
237
243
|
if result then
|
|
238
|
-
|
|
239
|
-
read_node x.children, x, doc_element, indent, i
|
|
244
|
+
read_node x, element, doc_element, indent, i
|
|
240
245
|
end
|
|
241
246
|
|
|
242
247
|
end
|
|
@@ -244,11 +249,12 @@ class Rexslt
|
|
|
244
249
|
def indent_before(element, x, doc_element, indent, i)
|
|
245
250
|
text = ''
|
|
246
251
|
unless doc_element.texts.empty? and doc_element.texts.last.nil? then
|
|
247
|
-
|
|
252
|
+
if indent > 1 then
|
|
253
|
+
text = "\n" + ' ' * (indent - 1) #unless doc_element.texts.last.to_s[/^\n\s/m]
|
|
254
|
+
end
|
|
248
255
|
else
|
|
249
256
|
text = "\n" + ' ' * (indent - 1)
|
|
250
257
|
end
|
|
251
|
-
text = ' ' if text.empty?
|
|
252
258
|
|
|
253
259
|
doc_element.add_text text if text
|
|
254
260
|
end
|
|
@@ -263,7 +269,7 @@ class Rexslt
|
|
|
263
269
|
def indent_element(element, x, doc_element, indent, previous_indent)
|
|
264
270
|
indent_before(element, x, doc_element, indent, i) if @indent == true
|
|
265
271
|
yield
|
|
266
|
-
indent_after(element, x, doc_element, previous_indent
|
|
272
|
+
indent_after(element, x, doc_element, previous_indent) if @indent == true
|
|
267
273
|
end
|
|
268
274
|
|
|
269
275
|
def padding(element,raw_indent, x)
|
|
@@ -278,14 +284,17 @@ class Rexslt
|
|
|
278
284
|
|
|
279
285
|
procs = {"Rexle::Element" => :read_raw_element, "String" => :read_raw_text}
|
|
280
286
|
|
|
281
|
-
template_node.
|
|
287
|
+
template_node.children.each_with_index do |x,j|
|
|
282
288
|
method(procs[x.class.to_s]).call(element, x, doc_element, indent, i)
|
|
289
|
+
|
|
283
290
|
end
|
|
291
|
+
|
|
284
292
|
end
|
|
285
293
|
|
|
286
294
|
# element: xml source element, x: xsl element, doc_element: current destination xml element
|
|
287
295
|
#
|
|
288
296
|
def read_raw_text(element, x, doc_element, raw_indent, i)
|
|
297
|
+
|
|
289
298
|
#val = @indent == true ? padding(doc_element, raw_indent, x) : ''
|
|
290
299
|
if x.to_s.strip.length > 0 then
|
|
291
300
|
val = x.to_s #
|
|
@@ -293,27 +302,30 @@ class Rexslt
|
|
|
293
302
|
end
|
|
294
303
|
end
|
|
295
304
|
|
|
296
|
-
def read_raw_element(element, x, doc_element, indent,
|
|
305
|
+
def read_raw_element(element, x, doc_element, indent, j)
|
|
297
306
|
|
|
298
307
|
method_name = x.name.gsub(/[:-]/,'_').to_sym
|
|
299
308
|
|
|
300
309
|
if @xsl_methods.include? method_name then
|
|
310
|
+
|
|
301
311
|
if method_name == :'xsl_apply_templates' then
|
|
302
312
|
#doc_element = doc_element.elements.last
|
|
303
313
|
end
|
|
304
|
-
|
|
314
|
+
|
|
315
|
+
method(method_name).call(element, x, doc_element, indent, i=0)
|
|
316
|
+
|
|
305
317
|
else
|
|
306
|
-
|
|
318
|
+
|
|
307
319
|
previous_indent = indent
|
|
308
320
|
la = x.name
|
|
309
|
-
|
|
321
|
+
new_indent = indent + 1 if @indent == true
|
|
322
|
+
|
|
310
323
|
if x.children.length > 0 then
|
|
311
324
|
|
|
312
|
-
new_indent = indent + 1 if @indent == true
|
|
313
325
|
new_element = x.clone
|
|
326
|
+
new_element.text = ''
|
|
314
327
|
|
|
315
|
-
|
|
316
|
-
new_element2.attributes.each do |k,v|
|
|
328
|
+
new_element.attributes.each do |k,v|
|
|
317
329
|
|
|
318
330
|
if v[/{/] then
|
|
319
331
|
|
|
@@ -324,29 +336,29 @@ class Rexslt
|
|
|
324
336
|
end
|
|
325
337
|
end
|
|
326
338
|
|
|
327
|
-
indent_before(element, x, doc_element, new_indent,
|
|
339
|
+
indent_before(element, x, doc_element, new_indent, j) if @indent == true
|
|
340
|
+
doc_element.add new_element
|
|
341
|
+
read_node(x, element, new_element, new_indent, i)
|
|
342
|
+
|
|
343
|
+
if @indent == true then
|
|
344
|
+
if doc_element.children.last.children.any? \
|
|
345
|
+
{|x| x.is_a? Rexle::Element} then
|
|
328
346
|
|
|
329
|
-
|
|
330
|
-
|
|
347
|
+
doc_element.children.last.add_text "\n" + ' ' * (new_indent - 1)
|
|
348
|
+
end
|
|
349
|
+
end
|
|
331
350
|
|
|
332
|
-
read_node(x, element, new_element2, new_indent, i)
|
|
333
|
-
indent_after(element, x, doc_element, previous_indent, i) if @indent == true
|
|
334
351
|
|
|
335
352
|
else
|
|
336
353
|
|
|
337
|
-
|
|
338
|
-
indent_before(element, x, doc_element, indent, i) if @indent == true
|
|
339
|
-
end
|
|
354
|
+
indent_before(element, x, doc_element, new_indent, i) if @indent == true
|
|
340
355
|
|
|
341
|
-
val = @indent == true ?
|
|
356
|
+
val = @indent == true ? x.to_s : x.to_s
|
|
342
357
|
doc_element.add val
|
|
343
358
|
|
|
344
|
-
if @indent == true then
|
|
345
|
-
indent_after(element, x, doc_element, previous_indent, i)
|
|
346
|
-
end
|
|
347
|
-
|
|
348
359
|
end
|
|
349
|
-
end
|
|
360
|
+
end
|
|
361
|
+
|
|
350
362
|
end
|
|
351
363
|
|
|
352
364
|
def xsl_text(element, x, doc_element, indent, i)
|
|
@@ -358,24 +370,27 @@ class Rexslt
|
|
|
358
370
|
def xsl_value_of(element, x, doc_element, indent, i)
|
|
359
371
|
|
|
360
372
|
field = x.attributes[:select]
|
|
373
|
+
|
|
361
374
|
o = case field
|
|
362
375
|
when '.'
|
|
363
376
|
element.value
|
|
364
377
|
when /^\$/
|
|
365
378
|
@param[field[/^\$(.*)/,1]]
|
|
366
379
|
else
|
|
367
|
-
element.text(field)
|
|
380
|
+
ee = element.text(field)
|
|
381
|
+
ee
|
|
368
382
|
end
|
|
369
383
|
|
|
370
|
-
doc_element.add_element o.to_s
|
|
371
|
-
end
|
|
384
|
+
doc_element.add_element o.to_s #unless o.to_s.empty?
|
|
385
|
+
end
|
|
386
|
+
|
|
372
387
|
|
|
373
388
|
def xslt_transform(xsl, xml, custom_params={})
|
|
374
389
|
|
|
375
390
|
doc_xml = Rexle.new xml
|
|
376
391
|
@doc_xsl = Rexle.new xsl
|
|
377
392
|
|
|
378
|
-
@doc = Rexle.new '<root
|
|
393
|
+
@doc = Rexle.new '<root></root>'
|
|
379
394
|
indent = 0
|
|
380
395
|
|
|
381
396
|
previous_indent = 0
|
|
@@ -393,11 +408,10 @@ class Rexslt
|
|
|
393
408
|
end
|
|
394
409
|
end
|
|
395
410
|
|
|
396
|
-
h = @doc_xsl.root.
|
|
397
|
-
{|r,x| r.merge(x.name.to_sym => x.value)}
|
|
398
|
-
|
|
399
|
-
@indent = (h and h[:indent] == 'yes') ? true : false
|
|
411
|
+
h = @doc_xsl.root.element("xsl:output/attribute::*")
|
|
400
412
|
|
|
413
|
+
@indent = (h and h[:indent] == 'yes') ? true : false
|
|
414
|
+
|
|
401
415
|
params = @doc_xsl.root.xpath("xsl:param").map{|x| [x.attributes[:name], x.value]}
|
|
402
416
|
@param = Hash[params].merge(custom_params) if params
|
|
403
417
|
# search for params
|
|
@@ -413,7 +427,7 @@ class Rexslt
|
|
|
413
427
|
# using the 1st template
|
|
414
428
|
xpath = String.new @templates.to_a[0][0]
|
|
415
429
|
read_node(@templates.to_a[0][-1], doc_xml.element(xpath), @doc.root, indent)
|
|
416
|
-
|
|
430
|
+
|
|
417
431
|
end
|
|
418
432
|
|
|
419
433
|
end
|
metadata
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: rexslt
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease:
|
|
5
|
-
version: 0.
|
|
5
|
+
version: 0.4.00
|
|
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-10-25 00:00:00 Z
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|
|
16
16
|
name: rxfhelper
|
|
@@ -70,6 +70,6 @@ rubyforge_project:
|
|
|
70
70
|
rubygems_version: 1.8.23
|
|
71
71
|
signing_key:
|
|
72
72
|
specification_version: 3
|
|
73
|
-
summary:
|
|
73
|
+
summary: Rexslt is an XSLT processor written purely in Ruby
|
|
74
74
|
test_files: []
|
|
75
75
|
|