rexslt 0.3.10 → 0.4.00
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
|