rexslt 0.3.4 → 0.3.5

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 +44 -18
  2. metadata +3 -5
data/lib/rexslt.rb CHANGED
@@ -37,8 +37,8 @@ class Rexslt
37
37
  xslt_transform *[xsl, xml].map{|x| RXFHelper.read(x).first}
38
38
  end
39
39
 
40
- def to_s()
41
- @doc.to_s[/<root>(.*)<\/root>/m,1]
40
+ def to_s(options={})
41
+ @doc.to_s(options)[/<root>(.*)<\/root>/m,1]
42
42
  end
43
43
 
44
44
  def to_doc(); @doc; end
@@ -51,7 +51,6 @@ class Rexslt
51
51
 
52
52
  field = x.attributes[:select]
53
53
  node = element.element field
54
-
55
54
  return unless node
56
55
 
57
56
  keypath = node.to_xpath :no_cond
@@ -60,9 +59,13 @@ class Rexslt
60
59
  # check for a nest <xsl:sort element
61
60
 
62
61
  sort = x.element('xsl:sort')
62
+
63
63
  if sort then
64
- orderx = sort.attributes[:order]
64
+
65
+ orderx = sort.attributes[:order] || 'ascending'
65
66
  sort_field = sort.attributes[:select]
67
+ data_type = sort.attributes[:'data-type'] || 'text'
68
+
66
69
  end
67
70
 
68
71
  raw_template = @templates.to_a.find do |raw_item, template|
@@ -86,7 +89,22 @@ class Rexslt
86
89
  template_xpath, template = raw_template
87
90
 
88
91
  if sort_field then
89
- matched_node.sort_by{|x| x.element(sort_field).text}.each do |child_node|
92
+ sort_order = lambda do |x|
93
+ r = x.element(sort_field);
94
+
95
+ if r.respond_to?(:text) then
96
+ orderx == 'ascending' ? r.text : -r.text
97
+ else
98
+
99
+ if orderx == 'ascending' then
100
+ data_type == 'text' ? r : r.to_i
101
+ else
102
+ data_type == 'text' ? -r : -r.to_i
103
+ end
104
+ end
105
+ end
106
+
107
+ matched_node.sort_by(&sort_order).each do |child_node|
90
108
  read_node template, child_node, doc_element, indent
91
109
  end
92
110
  else
@@ -98,9 +116,18 @@ class Rexslt
98
116
 
99
117
  end
100
118
 
101
- def match?(keypath, path)
102
- x = keypath.split('/').reverse.take path.length
103
- x == path.reverse
119
+ def match?(raw_keypath, raw_path)
120
+ return false if raw_path == ['*']
121
+ keypath = raw_keypath.split('/').reverse.take raw_path.length
122
+ path = raw_path.reverse
123
+ r = path.map.with_index.select{|x,i|x == '*'}.map(&:last)
124
+
125
+ r.each do |n|
126
+ # get the relative value from path
127
+ path[n] = keypath[n]
128
+ end
129
+
130
+ keypath == path
104
131
  end
105
132
 
106
133
 
@@ -146,7 +173,6 @@ class Rexslt
146
173
  def xsl_element(element, x, doc_element, indent)
147
174
 
148
175
  indent_before(element, x, doc_element, indent + 1) if @indent == true
149
-
150
176
  name = x.attributes[:name]
151
177
  new_element = Rexle::Element.new(name).add_text(x.text)
152
178
  doc_element.add new_element
@@ -246,19 +272,19 @@ class Rexslt
246
272
  end
247
273
 
248
274
  def read_raw_element(element, x, doc_element, indent)
249
-
275
+
250
276
  method_name = x.name.gsub(/[:-]/,'_').to_sym
251
-
277
+
252
278
  if @xsl_methods.include? method_name then
253
279
  method(method_name).call(element, x, doc_element, indent)
254
280
  else
255
281
 
256
- previous_indent = indent
282
+ previous_indent = indent
257
283
  la = x.name
258
284
 
259
285
  if x.children.length > 0 then
260
286
 
261
- new_indent = indent + 1
287
+ new_indent = indent + 1 if @indent == true
262
288
  new_element = x.clone
263
289
 
264
290
  new_element2 = new_element.deep_clone
@@ -276,6 +302,8 @@ class Rexslt
276
302
  indent_before(element, x, doc_element, new_indent) if @indent == true
277
303
 
278
304
  #jr070412 new_element.text = new_element.text.strip if @indent == false
305
+
306
+ new_element2.text = new_element2.text.strip
279
307
  doc_element.add new_element2
280
308
 
281
309
  read_node(x, element, new_element2, new_indent)
@@ -297,7 +325,7 @@ class Rexslt
297
325
  end
298
326
  end
299
327
  end
300
-
328
+
301
329
  def xsl_text(element, x, doc_element, indent)
302
330
  val = @indent == true ? padding(doc_element, indent, x) : ''
303
331
  val += x.text
@@ -305,7 +333,6 @@ class Rexslt
305
333
  end
306
334
 
307
335
  def xsl_value_of(element, x, doc_element, indent)
308
-
309
336
  field = x.attributes[:select]
310
337
  o = field == '.' ? element.text : element.text(field)
311
338
  doc_element.add_element o.to_s
@@ -348,13 +375,12 @@ class Rexslt
348
375
 
349
376
  # using the 1st template
350
377
  xpath = String.new @templates.to_a[0][0]
351
-
378
+
352
379
  if doc_xml.root.name == xpath then
353
380
  read_node(@templates.to_a[0][-1], doc_xml.element(xpath), @doc.root, indent)
354
381
  else
355
382
  # use this template
356
- node = doc_xml.root.element(xpath)
357
- read_node(@templates.to_a[0][-1], doc_xml, node, indent)
383
+ read_node(@templates.to_a[0][-1], doc_xml.element(xpath), @doc.root, indent)
358
384
  end
359
385
 
360
386
  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.4
5
+ version: 0.3.5
6
6
  platform: ruby
7
7
  authors:
8
8
  - James Robertson
@@ -10,8 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2012-04-08 00:00:00 +01:00
14
- default_executable:
13
+ date: 2012-06-24 00:00:00 Z
15
14
  dependencies:
16
15
  - !ruby/object:Gem::Dependency
17
16
  name: rxfhelper
@@ -45,7 +44,6 @@ extra_rdoc_files: []
45
44
 
46
45
  files:
47
46
  - lib/rexslt.rb
48
- has_rdoc: true
49
47
  homepage:
50
48
  licenses: []
51
49
 
@@ -69,7 +67,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
69
67
  requirements: []
70
68
 
71
69
  rubyforge_project:
72
- rubygems_version: 1.5.2
70
+ rubygems_version: 1.8.23
73
71
  signing_key:
74
72
  specification_version: 3
75
73
  summary: rexslt