rexslt 0.3.2 → 0.3.3

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 +65 -32
  2. metadata +2 -2
data/lib/rexslt.rb CHANGED
@@ -34,7 +34,7 @@ class Rexslt
34
34
 
35
35
  def initialize(xsl, xml)
36
36
  super()
37
- xslt_transform *[xsl, xml].map{|x| RXFHelper.read(x)}
37
+ xslt_transform *[xsl, xml].map{|x| RXFHelper.read(x).first}
38
38
  end
39
39
 
40
40
  def to_s()
@@ -47,21 +47,28 @@ class Rexslt
47
47
 
48
48
  private
49
49
 
50
- def apply_templates(element, x, doc_element, indent)
50
+ def xsl_apply_templates(element, x, doc_element, indent)
51
51
 
52
52
  field = x.attributes[:select]
53
-
54
53
  node = element.element field
55
54
 
56
55
  return unless node
57
56
 
58
57
  keypath = node.to_xpath :no_cond
59
58
  matched_node = nil
59
+
60
+ # check for a nest <xsl:sort element
61
+
62
+ sort = x.element('xsl:sort')
63
+ if sort then
64
+ orderx = sort.attributes[:order]
65
+ sort_field = sort.attributes[:select]
66
+ end
60
67
 
61
68
  raw_template = @templates.to_a.find do |raw_item, template|
62
69
 
63
70
  item = raw_item.split('/')
64
-
71
+
65
72
  if match? keypath, item then
66
73
  matched_node = element.xpath field
67
74
  true
@@ -78,9 +85,14 @@ class Rexslt
78
85
 
79
86
  template_xpath, template = raw_template
80
87
 
81
- matched_node.each do |child_node|
82
-
83
- read_node template, child_node, doc_element, indent
88
+ if sort_field then
89
+ matched_node.sort_by{|x| x.element(sort_field).text}.each do |child_node|
90
+ read_node template, child_node, doc_element, indent
91
+ end
92
+ else
93
+ matched_node.each do |child_node|
94
+ read_node template, child_node, doc_element, indent
95
+ end
84
96
  end
85
97
  end
86
98
 
@@ -92,14 +104,14 @@ class Rexslt
92
104
  end
93
105
 
94
106
 
95
- def attribute(element, x, doc_element, indent)
107
+ def xsl_attribute(element, x, doc_element, indent)
96
108
 
97
109
  name = x.attributes[:name]
98
110
  value = x.text
99
111
  doc_element.add_attribute name, value
100
112
  end
101
113
 
102
- def choose(element, x, doc_element, indent)
114
+ def xsl_choose(element, x, doc_element, indent)
103
115
 
104
116
  #get the when clause
105
117
 
@@ -123,7 +135,7 @@ class Rexslt
123
135
 
124
136
  end
125
137
 
126
- def copy_of(element, x, doc_element, indent)
138
+ def xsl_copy_of(element, x, doc_element, indent)
127
139
 
128
140
  indent_element(element, x, doc_element, indent, indent - 1) do
129
141
  doc_element.add element
@@ -131,17 +143,18 @@ class Rexslt
131
143
 
132
144
  end
133
145
 
134
- def element(element, x, doc_element, indent)
146
+ def xsl_element(element, x, doc_element, indent)
135
147
 
136
148
  indent_before(element, x, doc_element, indent + 1) if @indent == true
149
+
137
150
  name = x.attributes[:name]
138
- new_element = Rexle::Element.new name
151
+ new_element = Rexle::Element.new(name).add_text(x.text)
139
152
  doc_element.add new_element
140
153
  read_node(x, element, new_element, indent)
141
154
  indent_after(element, x, doc_element, indent) if @indent == true
142
155
  end
143
156
 
144
- def for_each(element, x, doc_element, indent)
157
+ def xsl_for_each(element, x, doc_element, indent)
145
158
 
146
159
  xpath = x.attributes[:select]
147
160
  nodes = element.match xpath
@@ -173,7 +186,7 @@ class Rexslt
173
186
 
174
187
  end
175
188
 
176
- def if(element, x, doc_element, indent)
189
+ def xsl_if(element, x, doc_element, indent)
177
190
 
178
191
  condition = x.attributes[:test]
179
192
  node = element.element, condition
@@ -193,6 +206,7 @@ class Rexslt
193
206
  end
194
207
 
195
208
  def indent_after(element, x, doc_element, prev_indent)
209
+
196
210
  if @indent == true then
197
211
  doc_element.add_text "\n" + ' ' * (prev_indent > 0 ? prev_indent - 1 : prev_indent)
198
212
  end
@@ -206,7 +220,7 @@ class Rexslt
206
220
 
207
221
  def padding(element,raw_indent, x)
208
222
  # if there is any other elements in doc_element don't check for an indent!!!!
209
- #puts doc_element.elements.count
223
+
210
224
  indent = 0
211
225
  indent = raw_indent + 1 if element.texts.length <= 0
212
226
  x.to_s.strip.length > 0 ? ' ' * indent : ''
@@ -219,7 +233,6 @@ class Rexslt
219
233
  template_node.each do |x|
220
234
  method(procs[x.class.to_s]).call(element, x, doc_element, indent)
221
235
  end
222
-
223
236
  end
224
237
 
225
238
  # element: xml source element, x: xsl element, doc_element: current destination xml element
@@ -234,8 +247,8 @@ class Rexslt
234
247
 
235
248
  def read_raw_element(element, x, doc_element, indent)
236
249
 
237
- method_name = x.name.gsub(/-/,'_').to_sym
238
-
250
+ method_name = x.name.gsub(/[:-]/,'_').to_sym
251
+
239
252
  if @xsl_methods.include? method_name then
240
253
  method(method_name).call(element, x, doc_element, indent)
241
254
  else
@@ -243,17 +256,29 @@ class Rexslt
243
256
  previous_indent = indent
244
257
  la = x.name
245
258
 
246
-
247
259
  if x.children.length > 0 then
248
260
 
249
261
  new_indent = indent + 1
250
262
  new_element = x.clone
251
263
 
264
+ new_element2 = new_element.deep_clone
265
+ new_element2.attributes.each do |k,v|
266
+
267
+ if v[/{/] then
268
+
269
+ v.gsub!(/(\{[^\}]+\})/) do |x2|
270
+ element.text(x2[/\{([^\}]+)\}/,1]).clone
271
+ end
272
+
273
+ end
274
+ end
275
+
252
276
  indent_before(element, x, doc_element, new_indent) if @indent == true
253
277
 
254
- doc_element.add new_element
278
+ #jr070412 new_element.text = new_element.text.strip if @indent == false
279
+ doc_element.add new_element2
255
280
 
256
- read_node(x, element, new_element, new_indent)
281
+ read_node(x, element, new_element2, new_indent)
257
282
  indent_after(element, x, doc_element, previous_indent) if @indent == true
258
283
 
259
284
  else
@@ -273,13 +298,14 @@ class Rexslt
273
298
  end
274
299
  end
275
300
 
276
- def text(element, x, doc_element, indent)
301
+ def xsl_text(element, x, doc_element, indent)
277
302
  val = @indent == true ? padding(doc_element, indent, x) : ''
278
303
  val += x.text
279
304
  doc_element.add_element val
280
305
  end
281
306
 
282
- def value_of(element, x, doc_element, indent)
307
+ def xsl_value_of(element, x, doc_element, indent)
308
+
283
309
  field = x.attributes[:select]
284
310
  o = field == '.' ? element.text : element.text(field)
285
311
  doc_element.add_element o.to_s
@@ -294,10 +320,11 @@ class Rexslt
294
320
  indent = 0
295
321
 
296
322
  previous_indent = 0
297
- @xsl_methods = [:apply_templates, :value_of, :element, :if, :choose,
298
- :when, :copy_of, :attribute, :for_each, :text]
323
+ @xsl_methods = [:'xsl_apply_templates', :'xsl_value_of', :'xsl_element', :'xsl_if', :'xsl_choose',
324
+ :'xsl_when', :'xsl_copy_of', :'xsl_attribute', :'xsl_for_each', :'xsl_text']
299
325
 
300
- strip_space = @doc_xsl.element "xsl:strip-space/attribute::elements"
326
+ strip_space = @doc_xsl.root.element "xsl:strip-space/attribute::elements"
327
+
301
328
  if strip_space then
302
329
  elements = strip_space.value
303
330
  elements.split.each do |element|
@@ -306,22 +333,28 @@ class Rexslt
306
333
  a.each {|node| node.parent.delete node}
307
334
  end
308
335
  end
309
-
310
- h = @doc_xsl.xpath("xsl:output/attribute::*").inject({})\
336
+
337
+ h = @doc_xsl.root.xpath("xsl:output/attribute::*").inject({})\
311
338
  {|r,x| r.merge(x.name.to_sym => x.value)}
312
339
 
313
- @indent = true if h and h[:indent] == 'yes'
340
+ @indent = (h and h[:indent] == 'yes') ? true : false
314
341
 
315
342
  # fetch the templates
316
- @templates = @doc_xsl.xpath('xsl:template').inject({}) do |r,x|
317
- r.merge(x.attributes[:match] => x)
343
+ #puts "Rexle:Version: " + Rexle.version
344
+
345
+ @templates = @doc_xsl.root.xpath('xsl:template').inject({}) do |r,x|
346
+ r.merge(x.attributes[:match] || x.attributes[:select] => x)
318
347
  end
319
348
 
320
349
  # using the 1st template
321
350
  xpath = String.new @templates.to_a[0][0]
322
351
 
323
352
  if doc_xml.root.name == xpath then
324
- read_node(@templates.to_a[0][-1], doc_xml, @doc.root, indent)
353
+ read_node(@templates.to_a[0][-1], doc_xml.element(xpath), @doc.root, indent)
354
+ else
355
+ # use this template
356
+ node = doc_xml.root.element(xpath)
357
+ read_node(@templates.to_a[0][-1], doc_xml, node, indent)
325
358
  end
326
359
 
327
360
  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.2
5
+ version: 0.3.3
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-02-09 00:00:00 +00:00
13
+ date: 2012-04-08 00:00:00 +01:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency