rexslt 0.3.5 → 0.3.6

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 +41 -34
  2. metadata +2 -2
@@ -47,7 +47,7 @@ class Rexslt
47
47
 
48
48
  private
49
49
 
50
- def xsl_apply_templates(element, x, doc_element, indent)
50
+ def xsl_apply_templates(element, x, doc_element, indent, i)
51
51
 
52
52
  field = x.attributes[:select]
53
53
  node = element.element field
@@ -70,6 +70,7 @@ class Rexslt
70
70
 
71
71
  raw_template = @templates.to_a.find do |raw_item, template|
72
72
 
73
+
73
74
  item = raw_item.split('/')
74
75
 
75
76
  if match? keypath, item then
@@ -104,12 +105,12 @@ class Rexslt
104
105
  end
105
106
  end
106
107
 
107
- matched_node.sort_by(&sort_order).each do |child_node|
108
- read_node template, child_node, doc_element, indent
108
+ matched_node.sort_by(&sort_order).each_with_index do |child_node,i|
109
+ read_node template, child_node, doc_element, indent, i+1
109
110
  end
110
111
  else
111
- matched_node.each do |child_node|
112
- read_node template, child_node, doc_element, indent
112
+ matched_node.each_with_index do |child_node,i|
113
+ read_node template, child_node, doc_element, indent, i+1
113
114
  end
114
115
  end
115
116
  end
@@ -130,15 +131,18 @@ class Rexslt
130
131
  keypath == path
131
132
  end
132
133
 
134
+ def position()
135
+ @position ||= 0
136
+ end
133
137
 
134
- def xsl_attribute(element, x, doc_element, indent)
138
+ def xsl_attribute(element, x, doc_element, indent, i)
135
139
 
136
140
  name = x.attributes[:name]
137
141
  value = x.text
138
142
  doc_element.add_attribute name, value
139
143
  end
140
144
 
141
- def xsl_choose(element, x, doc_element, indent)
145
+ def xsl_choose(element, x, doc_element, indent, i)
142
146
 
143
147
  #get the when clause
144
148
 
@@ -148,7 +152,7 @@ class Rexslt
148
152
  node = element.element condition
149
153
 
150
154
  if node and node == true
151
- read_node(xsl_node, element, doc_element, indent)
155
+ read_node(xsl_node, element, doc_element, indent, i)
152
156
  true
153
157
  else
154
158
  false
@@ -162,7 +166,7 @@ class Rexslt
162
166
 
163
167
  end
164
168
 
165
- def xsl_copy_of(element, x, doc_element, indent)
169
+ def xsl_copy_of(element, x, doc_element, indent, i)
166
170
 
167
171
  indent_element(element, x, doc_element, indent, indent - 1) do
168
172
  doc_element.add element
@@ -170,17 +174,17 @@ class Rexslt
170
174
 
171
175
  end
172
176
 
173
- def xsl_element(element, x, doc_element, indent)
177
+ def xsl_element(element, x, doc_element, indent, i)
174
178
 
175
- indent_before(element, x, doc_element, indent + 1) if @indent == true
179
+ indent_before(element, x, doc_element, indent + 1, i) if @indent == true
176
180
  name = x.attributes[:name]
177
181
  new_element = Rexle::Element.new(name).add_text(x.text)
178
182
  doc_element.add new_element
179
- read_node(x, element, new_element, indent)
180
- indent_after(element, x, doc_element, indent) if @indent == true
183
+ read_node(x, element, new_element, indent, i)
184
+ indent_after(element, x, doc_element, indent, i) if @indent == true
181
185
  end
182
186
 
183
- def xsl_for_each(element, x, doc_element, indent)
187
+ def xsl_for_each(element, x, doc_element, indent, i)
184
188
 
185
189
  xpath = x.attributes[:select]
186
190
  nodes = element.match xpath
@@ -208,18 +212,21 @@ class Rexslt
208
212
  nodes.reverse! if order.downcase == 'descending'
209
213
  end
210
214
 
211
- nodes.each {|node| read_node(x, node, doc_element, indent)}
215
+ nodes.each {|node| read_node(x, node, doc_element, indent, i)}
212
216
 
213
217
  end
214
218
 
215
- def xsl_if(element, x, doc_element, indent)
219
+ def xsl_if(element, x, doc_element, indent, i=0)
216
220
 
217
- condition = x.attributes[:test]
218
- node = element.element, condition
219
- read_node(x, element, doc_element, indent) if node and node == true
221
+ condition = x.attributes[:test].gsub('position()',i.to_s).gsub('&lt;','<').gsub('&gt;','>')
222
+ result = eval(condition)
223
+
224
+ if result then
225
+ read_node(x, element, doc_element, indent)
226
+ end
220
227
  end
221
228
 
222
- def indent_before(element, x, doc_element, indent)
229
+ def indent_before(element, x, doc_element, indent, i)
223
230
  text = ''
224
231
  unless doc_element.texts.empty? and doc_element.texts.last.nil? then
225
232
  text = ' ' * (indent - 1) unless doc_element.texts.last.to_s[/^\n\s/m]
@@ -239,9 +246,9 @@ class Rexslt
239
246
  end
240
247
 
241
248
  def indent_element(element, x, doc_element, indent, previous_indent)
242
- indent_before(element, x, doc_element, indent) if @indent == true
249
+ indent_before(element, x, doc_element, indent, i) if @indent == true
243
250
  yield
244
- indent_after(element, x, doc_element, previous_indent) if @indent == true
251
+ indent_after(element, x, doc_element, previous_indent, i) if @indent == true
245
252
  end
246
253
 
247
254
  def padding(element,raw_indent, x)
@@ -252,18 +259,18 @@ class Rexslt
252
259
  x.to_s.strip.length > 0 ? ' ' * indent : ''
253
260
  end
254
261
 
255
- def read_node(template_node, element, doc_element, indent)
262
+ def read_node(template_node, element, doc_element, indent, i=0)
256
263
 
257
264
  procs = {"Rexle::Element" => :read_raw_element, "String" => :read_raw_text}
258
265
 
259
266
  template_node.each do |x|
260
- method(procs[x.class.to_s]).call(element, x, doc_element, indent)
267
+ method(procs[x.class.to_s]).call(element, x, doc_element, indent, i)
261
268
  end
262
269
  end
263
270
 
264
271
  # element: xml source element, x: xsl element, doc_element: current destination xml element
265
272
  #
266
- def read_raw_text(element, x, doc_element, raw_indent)
273
+ def read_raw_text(element, x, doc_element, raw_indent, i)
267
274
  #val = @indent == true ? padding(doc_element, raw_indent, x) : ''
268
275
  if x.to_s.strip.length > 0 then
269
276
  val = x.to_s #
@@ -271,12 +278,12 @@ class Rexslt
271
278
  end
272
279
  end
273
280
 
274
- def read_raw_element(element, x, doc_element, indent)
281
+ def read_raw_element(element, x, doc_element, indent, i)
275
282
 
276
283
  method_name = x.name.gsub(/[:-]/,'_').to_sym
277
284
 
278
285
  if @xsl_methods.include? method_name then
279
- method(method_name).call(element, x, doc_element, indent)
286
+ method(method_name).call(element, x, doc_element, indent, i)
280
287
  else
281
288
 
282
289
  previous_indent = indent
@@ -299,40 +306,40 @@ class Rexslt
299
306
  end
300
307
  end
301
308
 
302
- indent_before(element, x, doc_element, new_indent) if @indent == true
309
+ indent_before(element, x, doc_element, new_indent, i) if @indent == true
303
310
 
304
311
  #jr070412 new_element.text = new_element.text.strip if @indent == false
305
312
 
306
313
  new_element2.text = new_element2.text.strip
307
314
  doc_element.add new_element2
308
315
 
309
- read_node(x, element, new_element2, new_indent)
310
- indent_after(element, x, doc_element, previous_indent) if @indent == true
316
+ read_node(x, element, new_element2, new_indent, i)
317
+ indent_after(element, x, doc_element, previous_indent, i) if @indent == true
311
318
 
312
319
  else
313
320
 
314
321
  unless doc_element.children.length > 0
315
- indent_before(element, x, doc_element, indent) if @indent == true
322
+ indent_before(element, x, doc_element, indent, i) if @indent == true
316
323
  end
317
324
 
318
325
  val = @indent == true ? ' ' + x.to_s : x.to_s
319
326
  doc_element.add val
320
327
 
321
328
  if @indent == true then
322
- indent_after(element, x, doc_element, previous_indent)
329
+ indent_after(element, x, doc_element, previous_indent, i)
323
330
  end
324
331
 
325
332
  end
326
333
  end
327
334
  end
328
335
 
329
- def xsl_text(element, x, doc_element, indent)
336
+ def xsl_text(element, x, doc_element, indent, i)
330
337
  val = @indent == true ? padding(doc_element, indent, x) : ''
331
338
  val += x.text
332
339
  doc_element.add_element val
333
340
  end
334
341
 
335
- def xsl_value_of(element, x, doc_element, indent)
342
+ def xsl_value_of(element, x, doc_element, indent, i)
336
343
  field = x.attributes[:select]
337
344
  o = field == '.' ? element.text : element.text(field)
338
345
  doc_element.add_element o.to_s
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: rexslt
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.3.5
5
+ version: 0.3.6
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-06-24 00:00:00 Z
13
+ date: 2012-06-26 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rxfhelper