rexslt 0.3.4 → 0.3.5

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 +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