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.
Files changed (2) hide show
  1. data/lib/rexslt.rb +61 -47
  2. 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)[/<root>(.*)<\/root>/m,1]
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
- read_node(node, element, doc_element, indent) if node
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('&lt;','<').gsub('&gt;','>')
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
- text = ' ' * (indent - 1) unless doc_element.texts.last.to_s[/^\n\s/m]
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, i) if @indent == true
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.each do |x|
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, i)
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
- method(method_name).call(element, x, doc_element, indent, i)
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
- new_element2 = new_element.deep_clone
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, i) if @indent == true
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
- new_element2.value = new_element2.value.strip
330
- doc_element.add new_element2
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
- unless doc_element.children.length > 0
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 ? ' ' + x.to_s : x.to_s
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.xpath("xsl:output/attribute::*").inject({})\
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.3.10
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-08-19 00:00:00 Z
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: rexslt
73
+ summary: Rexslt is an XSLT processor written purely in Ruby
74
74
  test_files: []
75
75