nokogiri 1.5.3.rc2 → 1.5.3.rc3

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of nokogiri might be problematic. Click here for more details.

@@ -6,6 +6,8 @@
6
6
  * Nokogiri::XML::Node#css now works for XML documents with default
7
7
  namespaces when the rule contains attribute selector without
8
8
  namespace.
9
+ * Fixed marshalling bugs around how arguments are passed to (and
10
+ returned from) XSLT custom xpath functions. #640.
9
11
 
10
12
 
11
13
  == 1.5.2 / 2012-03-09
@@ -6,6 +6,8 @@
6
6
  * Nokogiri::XML::Node#css now works for XML documents with default
7
7
  namespaces when the rule contains attribute selector without
8
8
  namespace.
9
+ * Fixed marshalling bugs around how arguments are passed to (and
10
+ returned from) XSLT custom xpath functions. #640.
9
11
 
10
12
 
11
13
  == 1.5.2 / 2012-03-09
@@ -49,26 +49,19 @@ static VALUE register_variable(VALUE self, VALUE name, VALUE value)
49
49
  return self;
50
50
  }
51
51
 
52
- static void ruby_funcall(xmlXPathParserContextPtr ctx, int nargs)
52
+ void Nokogiri_marshal_xpath_funcall_and_return_values(xmlXPathParserContextPtr ctx, int nargs, VALUE handler, const char* function_name)
53
53
  {
54
- VALUE xpath_handler = Qnil;
55
- VALUE result;
54
+ int i;
55
+ VALUE result, doc;
56
56
  VALUE *argv;
57
- VALUE doc;
58
57
  VALUE node_set = Qnil;
59
58
  xmlNodeSetPtr xml_node_set = NULL;
60
59
  xmlXPathObjectPtr obj;
61
- int i;
62
60
  nokogiriNodeSetTuple *node_set_tuple;
63
61
 
64
- assert(ctx);
65
- assert(ctx->context);
66
- assert(ctx->context->userData);
67
62
  assert(ctx->context->doc);
68
63
  assert(DOC_RUBY_OBJECT_TEST(ctx->context->doc));
69
64
 
70
- xpath_handler = (VALUE)(ctx->context->userData);
71
-
72
65
  argv = (VALUE *)calloc((size_t)nargs, sizeof(VALUE));
73
66
  for (i = 0 ; i < nargs ; ++i) {
74
67
  rb_gc_register_address(&argv[i]);
@@ -100,12 +93,7 @@ static void ruby_funcall(xmlXPathParserContextPtr ctx, int nargs)
100
93
  } while(i-- > 0);
101
94
  }
102
95
 
103
- result = rb_funcall2(
104
- xpath_handler,
105
- rb_intern((const char *)ctx->context->function),
106
- nargs,
107
- argv
108
- );
96
+ result = rb_funcall2(handler, rb_intern((const char*)function_name), nargs, argv);
109
97
 
110
98
  for (i = 0 ; i < nargs ; ++i) {
111
99
  rb_gc_unregister_address(&argv[i]);
@@ -156,6 +144,22 @@ static void ruby_funcall(xmlXPathParserContextPtr ctx, int nargs)
156
144
  }
157
145
  }
158
146
 
147
+ static void ruby_funcall(xmlXPathParserContextPtr ctx, int nargs)
148
+ {
149
+ VALUE handler = Qnil;
150
+ const char *function = NULL ;
151
+
152
+ assert(ctx);
153
+ assert(ctx->context);
154
+ assert(ctx->context->userData);
155
+ assert(ctx->context->function);
156
+
157
+ handler = (VALUE)(ctx->context->userData);
158
+ function = (const char*)(ctx->context->function);
159
+
160
+ Nokogiri_marshal_xpath_funcall_and_return_values(ctx, nargs, handler, function);
161
+ }
162
+
159
163
  static xmlXPathFunction lookup( void *ctx,
160
164
  const xmlChar * name,
161
165
  const xmlChar* ns_uri )
@@ -4,6 +4,7 @@
4
4
  #include <nokogiri.h>
5
5
 
6
6
  void init_xml_xpath_context();
7
+ void Nokogiri_marshal_xpath_funcall_and_return_values(xmlXPathParserContextPtr ctx, int nargs, VALUE handler, const char* function_name) ;
7
8
 
8
9
  extern VALUE cNokogiriXmlXpathContext;
9
10
  #endif
@@ -168,74 +168,17 @@ static VALUE transform(int argc, VALUE* argv, VALUE self)
168
168
 
169
169
  static void method_caller(xmlXPathParserContextPtr ctxt, int nargs)
170
170
  {
171
- const xmlChar * function;
172
- const xmlChar * functionURI;
173
- size_t i, count;
174
-
171
+ VALUE handler;
172
+ const char *function_name;
175
173
  xsltTransformContextPtr transform;
176
- xmlXPathObjectPtr xpath;
177
- VALUE obj;
178
- VALUE *args;
179
- VALUE result;
174
+ const xmlChar *functionURI;
180
175
 
181
176
  transform = xsltXPathGetTransformContext(ctxt);
182
-
183
- function = ctxt->context->function;
184
177
  functionURI = ctxt->context->functionURI;
185
- obj = (VALUE)xsltGetExtData(transform, functionURI);
186
-
187
- count = (size_t)ctxt->valueNr;
188
- args = calloc(count, sizeof(VALUE *));
189
-
190
- for(i = 0; i < count; i++) {
191
- VALUE thing;
192
-
193
- xpath = valuePop(ctxt);
194
- switch(xpath->type) {
195
- case XPATH_STRING:
196
- thing = NOKOGIRI_STR_NEW2(xpath->stringval);
197
- break;
198
- case XPATH_NODESET:
199
- if(NULL == xpath->nodesetval) {
200
- thing = Nokogiri_wrap_xml_node_set(
201
- xmlXPathNodeSetCreate(NULL),
202
- DOC_RUBY_OBJECT(ctxt->context->doc));
203
- } else {
204
- thing = Nokogiri_wrap_xml_node_set(xpath->nodesetval,
205
- DOC_RUBY_OBJECT(ctxt->context->doc));
206
- }
207
- break;
208
- default:
209
- rb_raise(rb_eRuntimeError, "do not handle type: %d", xpath->type);
210
- }
211
- args[i] = thing;
212
- xmlFree(xpath);
213
- }
214
- result = rb_funcall3(obj, rb_intern((const char *)function), (int)count, args);
215
- free(args);
216
- switch(TYPE(result)) {
217
- case T_FLOAT:
218
- case T_BIGNUM:
219
- case T_FIXNUM:
220
- xmlXPathReturnNumber(ctxt, NUM2DBL(result));
221
- break;
222
- case T_STRING:
223
- xmlXPathReturnString(
224
- ctxt,
225
- xmlStrdup((xmlChar *)StringValuePtr(result))
226
- );
227
- break;
228
- case T_TRUE:
229
- xmlXPathReturnTrue(ctxt);
230
- break;
231
- case T_FALSE:
232
- xmlXPathReturnFalse(ctxt);
233
- break;
234
- case T_NIL:
235
- break;
236
- default:
237
- rb_raise(rb_eRuntimeError, "Invalid return type");
238
- }
178
+ handler = (VALUE)xsltGetExtData(transform, functionURI);
179
+ function_name = (const char*)(ctxt->context->function);
180
+
181
+ Nokogiri_marshal_xpath_funcall_and_return_values(ctxt, nargs, handler, (const char*)function_name);
239
182
  }
240
183
 
241
184
  static void * initFunc(xsltTransformContextPtr ctxt, const xmlChar *uri)
@@ -1,6 +1,6 @@
1
1
  module Nokogiri
2
2
  # The version of Nokogiri you are using
3
- VERSION = '1.5.3.rc2'
3
+ VERSION = '1.5.3.rc3'
4
4
 
5
5
  class VersionInfo # :nodoc:
6
6
  def jruby?
@@ -15,7 +15,7 @@ module Nokogiri
15
15
  end
16
16
 
17
17
  ###
18
- # See Nokogiri::XSLT::Stylesheet for creating and maniuplating
18
+ # See Nokogiri::XSLT::Stylesheet for creating and manipulating
19
19
  # Stylesheet object.
20
20
  module XSLT
21
21
  class << self
@@ -11,25 +11,25 @@ warn "#{__FILE__}:#{__LINE__}: version info: #{Nokogiri::VERSION_INFO.inspect}"
11
11
 
12
12
  module Nokogiri
13
13
  class TestCase < MiniTest::Spec
14
- ASSETS_DIR = File.expand_path File.join(File.dirname(__FILE__), 'files')
15
- XML_FILE = File.join(ASSETS_DIR, 'staff.xml')
16
- XSLT_FILE = File.join(ASSETS_DIR, 'staff.xslt')
17
- EXSLT_FILE = File.join(ASSETS_DIR, 'exslt.xslt')
18
- EXML_FILE = File.join(ASSETS_DIR, 'exslt.xml')
19
- HTML_FILE = File.join(ASSETS_DIR, 'tlm.html')
20
- NICH_FILE = File.join(ASSETS_DIR, '2ch.html')
21
- SHIFT_JIS_XML = File.join(ASSETS_DIR, 'shift_jis.xml')
22
- SHIFT_JIS_HTML = File.join(ASSETS_DIR, 'shift_jis.html')
23
- ENCODING_XHTML_FILE = File.join(ASSETS_DIR, 'encoding.xhtml')
24
- ENCODING_HTML_FILE = File.join(ASSETS_DIR, 'encoding.html')
25
- NOENCODING_FILE = File.join(ASSETS_DIR, 'noencoding.html')
26
- METACHARSET_FILE = File.join(ASSETS_DIR, 'metacharset.html')
27
- PO_XML_FILE = File.join(ASSETS_DIR, 'po.xml')
28
- PO_SCHEMA_FILE = File.join(ASSETS_DIR, 'po.xsd')
14
+ ASSETS_DIR = File.expand_path File.join(File.dirname(__FILE__), 'files')
29
15
  ADDRESS_SCHEMA_FILE = File.join(ASSETS_DIR, 'address_book.rlx')
30
- ADDRESS_XML_FILE = File.join(ASSETS_DIR, 'address_book.xml')
31
- SNUGGLES_FILE = File.join(ASSETS_DIR, 'snuggles.xml')
32
- XML_XINCLUDE_FILE = File.join(ASSETS_DIR, 'xinclude.xml')
16
+ ADDRESS_XML_FILE = File.join(ASSETS_DIR, 'address_book.xml')
17
+ ENCODING_HTML_FILE = File.join(ASSETS_DIR, 'encoding.html')
18
+ ENCODING_XHTML_FILE = File.join(ASSETS_DIR, 'encoding.xhtml')
19
+ EXML_FILE = File.join(ASSETS_DIR, 'exslt.xml')
20
+ EXSLT_FILE = File.join(ASSETS_DIR, 'exslt.xslt')
21
+ HTML_FILE = File.join(ASSETS_DIR, 'tlm.html')
22
+ METACHARSET_FILE = File.join(ASSETS_DIR, 'metacharset.html')
23
+ NICH_FILE = File.join(ASSETS_DIR, '2ch.html')
24
+ NOENCODING_FILE = File.join(ASSETS_DIR, 'noencoding.html')
25
+ PO_SCHEMA_FILE = File.join(ASSETS_DIR, 'po.xsd')
26
+ PO_XML_FILE = File.join(ASSETS_DIR, 'po.xml')
27
+ SHIFT_JIS_HTML = File.join(ASSETS_DIR, 'shift_jis.html')
28
+ SHIFT_JIS_XML = File.join(ASSETS_DIR, 'shift_jis.xml')
29
+ SNUGGLES_FILE = File.join(ASSETS_DIR, 'snuggles.xml')
30
+ XML_FILE = File.join(ASSETS_DIR, 'staff.xml')
31
+ XML_XINCLUDE_FILE = File.join(ASSETS_DIR, 'xinclude.xml')
32
+ XSLT_FILE = File.join(ASSETS_DIR, 'staff.xslt')
33
33
 
34
34
  def teardown
35
35
  if ENV['NOKOGIRI_GC']
@@ -68,33 +68,6 @@ module Nokogiri
68
68
  alias :assert_not_nil :refute_nil
69
69
  alias :assert_raise :assert_raises
70
70
  alias :assert_not_equal :refute_equal
71
-
72
- def assert_nothing_raised(*args)
73
- self._assertions += 1
74
- if Module === args.last
75
- msg = nil
76
- else
77
- msg = args.pop
78
- end
79
- begin
80
- line = __LINE__; yield
81
- rescue Exception => e
82
- bt = e.backtrace
83
- as = e.instance_of?(MiniTest::Assertion)
84
- if as
85
- ans = /\A#{Regexp.quote(__FILE__)}:#{line}:in /o
86
- bt.reject! {|ln| ans =~ ln}
87
- end
88
- if ((args.empty? && !as) ||
89
- args.any? {|a| a.instance_of?(Module) ? e.is_a?(a) : e.class == a })
90
- msg = message(msg) { "Exception raised:\n<#{mu_pp(e)}>" }
91
- raise MiniTest::Assertion, msg.call, bt
92
- else
93
- raise
94
- end
95
- end
96
- nil
97
- end
98
71
  end
99
72
 
100
73
  module SAX
@@ -12,19 +12,21 @@ module Nokogiri
12
12
 
13
13
  def test_parse_empty_document
14
14
  # This caused a segfault in libxml 2.6.x
15
- assert_nothing_raised { @parser.parse '' }
15
+ assert_nil @parser.parse ''
16
16
  end
17
17
 
18
18
  def test_parse_empty_file
19
19
  # Make sure empty files don't break stuff
20
20
  empty_file_name = File.join(Dir.tmpdir, 'bogus.xml')
21
21
  FileUtils.touch empty_file_name
22
- assert_nothing_raised { @parser.parse_file empty_file_name }
22
+ # assert_nothing_raised do
23
+ @parser.parse_file empty_file_name
24
+ # end
23
25
  end
24
26
 
25
27
  def test_parse_file
26
28
  @parser.parse_file(HTML_FILE)
27
-
29
+
28
30
  # Take a look at the comment in test_parse_document to know
29
31
  # a possible reason to this difference.
30
32
  if Nokogiri.uses_libxml?
@@ -7,15 +7,13 @@ module Nokogiri
7
7
  module SAX
8
8
  class TestParserContext < Nokogiri::SAX::TestCase
9
9
  def test_from_io
10
- assert_nothing_raised do
11
- ParserContext.new StringIO.new('fo'), 'UTF-8'
12
- end
10
+ ctx = ParserContext.new StringIO.new('fo'), 'UTF-8'
11
+ assert ctx
13
12
  end
14
13
 
15
14
  def test_from_string
16
- assert_nothing_raised do
17
- ParserContext.new 'blah blah'
18
- end
15
+ ctx = ParserContext.new 'blah blah'
16
+ assert ctx
19
17
  end
20
18
 
21
19
  def test_parse_with
@@ -26,20 +24,20 @@ module Nokogiri
26
24
  end
27
25
 
28
26
  def test_parse_with_sax_parser
29
- assert_nothing_raised do
27
+ # assert_nothing_raised do
30
28
  xml = "<root />"
31
29
  ctx = ParserContext.new xml
32
30
  parser = Parser.new Doc.new
33
31
  ctx.parse_with parser
34
- end
32
+ # end
35
33
  end
36
34
 
37
35
  def test_from_file
38
- assert_nothing_raised do
36
+ # assert_nothing_raised do
39
37
  ctx = ParserContext.file HTML_FILE, 'UTF-8'
40
38
  parser = Parser.new Doc.new
41
39
  ctx.parse_with parser
42
- end
40
+ # end
43
41
  end
44
42
  end
45
43
  end
@@ -232,9 +232,7 @@ eohtml
232
232
  end
233
233
 
234
234
  def test_parse_handles_nil_gracefully
235
- assert_nothing_raised do
236
- @doc = Nokogiri::HTML::Document.parse(nil)
237
- end
235
+ @doc = Nokogiri::HTML::Document.parse(nil)
238
236
  assert_instance_of Nokogiri::HTML::Document, @doc
239
237
  end
240
238
 
@@ -101,9 +101,7 @@ module Nokogiri
101
101
  assert another_node, 'should have a node'
102
102
 
103
103
  # This used to segv
104
- assert_nothing_raised do
105
- node.add_previous_sibling another_node
106
- end
104
+ assert node.add_previous_sibling another_node
107
105
  end
108
106
 
109
107
  def test_swap
@@ -138,7 +136,7 @@ module Nokogiri
138
136
 
139
137
  def test_fragment_handler_does_not_regurge_on_invalid_attributes
140
138
  iframe = %Q{<iframe style="width: 0%; height: 0px" src="http://someurl" allowtransparency></iframe>}
141
- assert_nothing_raised { @html.at('div').fragment(iframe) }
139
+ assert @html.at('div').fragment(iframe)
142
140
  end
143
141
 
144
142
  def test_fragment
@@ -158,7 +158,9 @@ encoding="iso-8859-1" indent="yes"/>
158
158
  assert_equal result_array, result_hash
159
159
  end
160
160
 
161
- if Nokogiri.uses_libxml? # By now, cannot get it working on JRuby.
161
+ if Nokogiri.uses_libxml?
162
+ # By now, cannot get it working on JRuby, see:
163
+ # http://yokolet.blogspot.com/2010/10/pure-java-nokogiri-xslt-extension.html
162
164
  def test_exslt
163
165
  assert doc = Nokogiri::XML.parse(File.read(EXML_FILE))
164
166
  assert doc.xml?
@@ -66,15 +66,12 @@ world
66
66
  end
67
67
 
68
68
  def test_from_io
69
- assert_nothing_raised do
70
- ParserContext.new StringIO.new('fo'), 'UTF-8'
71
- end
69
+ ctx = ParserContext.new StringIO.new('fo'), 'UTF-8'
70
+ assert ctx
72
71
  end
73
72
 
74
73
  def test_from_string
75
- assert_nothing_raised do
76
- ParserContext.new 'blah blah'
77
- end
74
+ assert ParserContext.new 'blah blah'
78
75
  end
79
76
 
80
77
  def test_parse_with
@@ -85,20 +82,16 @@ world
85
82
  end
86
83
 
87
84
  def test_parse_with_sax_parser
88
- assert_nothing_raised do
89
- xml = "<root />"
90
- ctx = ParserContext.new xml
91
- parser = Parser.new Doc.new
92
- ctx.parse_with parser
93
- end
85
+ xml = "<root />"
86
+ ctx = ParserContext.new xml
87
+ parser = Parser.new Doc.new
88
+ assert_nil ctx.parse_with parser
94
89
  end
95
90
 
96
91
  def test_from_file
97
- assert_nothing_raised do
98
- ctx = ParserContext.file XML_FILE
99
- parser = Parser.new Doc.new
100
- ctx.parse_with parser
101
- end
92
+ ctx = ParserContext.file XML_FILE
93
+ parser = Parser.new Doc.new
94
+ assert_nil ctx.parse_with parser
102
95
  end
103
96
 
104
97
  def test_parse_with_returns_nil
@@ -4,12 +4,11 @@ module Nokogiri
4
4
  module XML
5
5
  class TestAttr < Nokogiri::TestCase
6
6
  def test_new
7
- assert_nothing_raised do
8
- 100.times {
9
- doc = Nokogiri::XML::Document.new
10
- Nokogiri::XML::Attr.new(doc, 'foo')
11
- }
12
- end
7
+ 100.times {
8
+ doc = Nokogiri::XML::Document.new
9
+ assert doc
10
+ assert Nokogiri::XML::Attr.new(doc, 'foo')
11
+ }
13
12
  end
14
13
 
15
14
  def test_content=
@@ -47,14 +47,13 @@ module Nokogiri
47
47
  end
48
48
 
49
49
  def test_builder_with_unlink
50
- assert_nothing_raised do
51
- Nokogiri::XML::Builder.new do |xml|
52
- xml.foo do
53
- xml.bar { xml.parent.unlink }
54
- xml.bar2
55
- end
50
+ b = Nokogiri::XML::Builder.new do |xml|
51
+ xml.foo do
52
+ xml.bar { xml.parent.unlink }
53
+ xml.bar2
56
54
  end
57
55
  end
56
+ assert b
58
57
  end
59
58
 
60
59
  def test_with_root
@@ -29,9 +29,7 @@ module Nokogiri
29
29
  end
30
30
 
31
31
  def test_lots_of_new_cdata
32
- assert_nothing_raised do
33
- 100.times { CDATA.new(@xml, "asdfasdf") }
34
- end
32
+ assert 100.times { CDATA.new(@xml, "asdfasdf") }
35
33
  end
36
34
 
37
35
  def test_content=
@@ -124,9 +124,8 @@ module Nokogiri
124
124
 
125
125
  def test_pp
126
126
  out = StringIO.new('')
127
- assert_nothing_raised do
128
- ::PP.pp @xml, out
129
- end
127
+ ::PP.pp @xml, out
128
+ assert_operator out.string.length, :>, 0
130
129
  end
131
130
 
132
131
  def test_create_internal_subset_on_existing_subset
@@ -295,9 +294,7 @@ module Nokogiri
295
294
  end
296
295
 
297
296
  def test_parse_handles_nil_gracefully
298
- assert_nothing_raised do
299
- @doc = Nokogiri::XML::Document.parse(nil)
300
- end
297
+ @doc = Nokogiri::XML::Document.parse(nil)
301
298
  assert_instance_of Nokogiri::XML::Document, @doc
302
299
  end
303
300
 
@@ -633,9 +630,7 @@ module Nokogiri
633
630
 
634
631
  def test_new
635
632
  doc = nil
636
- assert_nothing_raised {
637
- doc = Nokogiri::XML::Document.new
638
- }
633
+ doc = Nokogiri::XML::Document.new
639
634
  assert doc
640
635
  assert doc.xml?
641
636
  assert_nil doc.root
@@ -643,9 +638,7 @@ module Nokogiri
643
638
 
644
639
  def test_set_root
645
640
  doc = nil
646
- assert_nothing_raised {
647
- doc = Nokogiri::XML::Document.new
648
- }
641
+ doc = Nokogiri::XML::Document.new
649
642
  assert doc
650
643
  assert doc.xml?
651
644
  assert_nil doc.root
@@ -168,7 +168,7 @@ module Nokogiri
168
168
  set = html.xpath("/html/body/div")
169
169
  assert_equal set.first, set.search(".a").first
170
170
  end
171
-
171
+
172
172
  def test_css_search_with_namespace
173
173
  fragment = Nokogiri::XML.fragment(<<-eoxml)
174
174
  <html xmlns="http://www.w3.org/1999/xhtml">
@@ -176,7 +176,7 @@ module Nokogiri
176
176
  <body></body>
177
177
  </html>
178
178
  eoxml
179
- assert_nothing_raised{ fragment.children.search( 'body', { 'xmlns' => 'http://www.w3.org/1999/xhtml' }) }
179
+ assert fragment.children.search( 'body', { 'xmlns' => 'http://www.w3.org/1999/xhtml' })
180
180
  end
181
181
 
182
182
  def test_double_equal
@@ -30,9 +30,7 @@ module Nokogiri
30
30
  doc = Document.new
31
31
  node = Nokogiri::XML::Element.new('foo', doc)
32
32
 
33
- assert_nothing_raised do
34
- Text.new('hello world', node)
35
- end
33
+ assert Text.new('hello world', node)
36
34
  end
37
35
 
38
36
  def test_content=
@@ -100,12 +100,10 @@ module Nokogiri
100
100
 
101
101
  def test_css_search_uses_custom_selectors
102
102
  set = @xml.xpath('//employee')
103
- assert_nothing_raised do
104
- if Nokogiri.uses_libxml?
105
- @xml.css('employee:thing()', @handler)
106
- else
107
- @xml.xpath("//employee[nokogiri:thing(.)]", @ns, @handler)
108
- end
103
+ if Nokogiri.uses_libxml?
104
+ @xml.css('employee:thing()', @handler)
105
+ else
106
+ @xml.xpath("//employee[nokogiri:thing(.)]", @ns, @handler)
109
107
  end
110
108
  assert_equal(set.length, @handler.things.length)
111
109
  assert_equal(set.to_a, @handler.things.flatten)
@@ -58,6 +58,41 @@ EOXSL
58
58
  assert_equal 'FOO', result.css('title').first.text
59
59
  end
60
60
 
61
+
62
+ def test_function_arguments
63
+ skip("Pure Java version doesn't support this feature.") if !Nokogiri.uses_libxml?
64
+ foo = Class.new do
65
+ include MiniTest::Assertions
66
+
67
+ def multiarg *args
68
+ assert_equal ["abc", "xyz"], args
69
+ args.first
70
+ end
71
+
72
+ def numericarg arg
73
+ assert_equal 42, arg
74
+ arg
75
+ end
76
+ end
77
+
78
+ xsl = Nokogiri.XSLT(<<-EOXSL, "http://e.org/functions" => foo)
79
+ <?xml version="1.0"?>
80
+ <xsl:stylesheet version="1.0"
81
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
82
+ xmlns:f="http://e.org/functions"
83
+ extension-element-prefixes="f">
84
+
85
+ <xsl:template match="text()">
86
+ <xsl:copy-of select="f:multiarg('abc', 'xyz')"/>
87
+ <xsl:copy-of select="f:numericarg(42)"/>
88
+ </xsl:template>
89
+ </xsl:stylesheet>
90
+ EOXSL
91
+
92
+ xsl.transform @xml
93
+ end
94
+
95
+
61
96
  def test_function_XSLT
62
97
  skip("Pure Java version doesn't support this feature.") if !Nokogiri.uses_libxml?
63
98
  foo = Class.new do
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nokogiri
3
3
  version: !ruby/object:Gem::Version
4
- hash: -1629906982
4
+ hash: 1880734685
5
5
  prerelease: 6
6
6
  segments:
7
7
  - 1
8
8
  - 5
9
9
  - 3
10
10
  - rc
11
- - 2
12
- version: 1.5.3.rc2
11
+ - 3
12
+ version: 1.5.3.rc3
13
13
  platform: ruby
14
14
  authors:
15
15
  - Aaron Patterson
@@ -19,7 +19,7 @@ autorequire:
19
19
  bindir: bin
20
20
  cert_chain: []
21
21
 
22
- date: 2012-03-22 00:00:00 Z
22
+ date: 2012-03-26 00:00:00 Z
23
23
  dependencies:
24
24
  - !ruby/object:Gem::Dependency
25
25
  version_requirements: &id001 !ruby/object:Gem::Requirement