rexslt 0.3.2 → 0.3.3

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