rexslt 0.3.10 → 0.4.00

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