rexslt 0.1.2 → 0.1.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 +77 -15
  2. metadata +2 -2
data/lib/rexslt.rb CHANGED
@@ -8,16 +8,19 @@ class Rexslt
8
8
  doc_xml = Document.new(xml)
9
9
  doc_xsl = Document.new(xsl)
10
10
 
11
- @xsl_methods = [:apply_templates, :value_of]
11
+ @xsl_methods = [:apply_templates, :value_of, :element, :if, :choose, :when]
12
12
 
13
13
  # fetch the templates
14
14
  @templates = XPath.match(doc_xsl.root, 'xsl:template').inject({}) do |r,x|
15
15
  r.merge(x.attribute('match').value => x)
16
16
  end
17
17
 
18
+ xpath = String.new @templates.to_a[0][0]
19
+ o = XPath.first(doc_xml, xpath)
20
+
18
21
  # using the 1st template
19
- @a = XPath.match(doc_xml, @templates.to_a[0][0]).map do |x|
20
- read_template @templates.to_a[0][-1], x
22
+ @a = XPath.match(doc_xml, xpath).map do |x|
23
+ read_node @templates.to_a[0][-1], x
21
24
  end
22
25
 
23
26
  end
@@ -30,29 +33,88 @@ class Rexslt
30
33
 
31
34
  private
32
35
 
33
- def read_template(template_node, doc_node)
34
-
35
- XPath.match(template_node, '*').map do |x|
36
+ def read_node(template_node, doc_node)
36
37
 
37
- method_name = x.name.gsub(/-/,'_').to_sym
38
+ procs = {"REXML::Element" => :read_raw_element, "REXML::Text" => :read_raw_text}
39
+ template_node.map do |x|
40
+ #puts 'x : ' + x.inspect
41
+ method(procs[x.class.to_s]).call(doc_node, x)
42
+ end
43
+
44
+ end
38
45
 
39
- if @xsl_methods.include? method_name then
40
- field = x.attribute('select').value.to_s if x.attribute('select')
41
- method(method_name).call(doc_node, field)
42
- else
46
+ def read_raw_text(doc_node, x)
47
+ r = x.to_s.strip.length > 0 ? x.to_s : ''
48
+ #puts 'xx : ' + r.inspect
49
+ r
50
+ end
51
+
52
+ def read_raw_element(doc_node, x)
53
+ method_name = x.name.gsub(/-/,'_').to_sym
54
+ if @xsl_methods.include? method_name then
55
+
56
+ method(method_name).call(doc_node, x)
57
+ else
58
+
59
+ if x.has_elements? then
60
+ element = "<%s>%%s</%s>" % ([x.name.to_s] * 2)
61
+ k = element % read_node(x, doc_node).flatten.join
62
+ #puts 'k : ' + k.inspect
63
+ k
64
+ else
43
65
  x.to_s
44
66
  end
45
- end
67
+ end
46
68
  end
47
69
 
48
- def apply_templates(doc_node, field)
70
+ def apply_templates(doc_node, x)
71
+ field = x.attribute('select').value.to_s
49
72
  XPath.match(doc_node, field).map do |x|
50
- read_template @templates[field], x
73
+ read_node @templates[field], x
51
74
  end
52
75
  end
53
76
 
54
- def value_of(doc_node, field)
77
+ def value_of(doc_node, x)
78
+ field = x.attribute('select').value.to_s
55
79
  doc_node.text(field)
56
80
  end
57
81
 
82
+ def element(doc_node, x)
83
+ name = x.attribute('name').value.to_s
84
+ element = "<%s>%%s</%s>" % ([name] * 2)
85
+ r = element % (read_node(x, doc_node).flatten.join)
86
+ #puts 'r : ' + r.inspect
87
+ r
88
+ end
89
+
90
+ def if(doc_node, x)
91
+ condition = x.attribute('test').value.to_s
92
+ node = XPath.first(doc_node, condition)
93
+ read_node(x, doc_node).flatten.join if node and node == true
94
+ end
95
+
96
+ def choose(doc_node, x)
97
+
98
+ #get the when clause
99
+ nodes = XPath.match(x, "xsl:when")
100
+
101
+ r = nodes.map do |xsl_node|
102
+
103
+ condition = xsl_node.attribute('test').value.to_s
104
+ node = XPath.first(doc_node, condition)
105
+
106
+ if node and node == true then
107
+ read_node(xsl_node, doc_node).flatten.join
108
+ else
109
+ nil
110
+ end
111
+ end
112
+
113
+ if r.compact.length <= 0 then
114
+ xsl_node = XPath.first(x, 'xsl:otherwise')
115
+ r = read_node(xsl_node, doc_node).flatten.join if xsl_node
116
+ end
117
+
118
+ r
119
+ end
58
120
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: rexslt
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.1.2
5
+ version: 0.1.3
6
6
  platform: ruby
7
7
  authors: []
8
8
 
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-03-08 00:00:00 +00:00
13
+ date: 2011-04-07 00:00:00 +01:00
14
14
  default_executable:
15
15
  dependencies: []
16
16