nokogiri 1.8.5 → 1.13.9
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.
- checksums.yaml +4 -4
- data/Gemfile +3 -21
- data/LICENSE-DEPENDENCIES.md +1159 -868
- data/LICENSE.md +5 -28
- data/README.md +196 -90
- data/bin/nokogiri +63 -50
- data/dependencies.yml +13 -59
- data/ext/nokogiri/depend +38 -358
- data/ext/nokogiri/extconf.rb +765 -420
- data/ext/nokogiri/gumbo.c +584 -0
- data/ext/nokogiri/html4_document.c +166 -0
- data/ext/nokogiri/html4_element_description.c +294 -0
- data/ext/nokogiri/html4_entity_lookup.c +37 -0
- data/ext/nokogiri/html4_sax_parser_context.c +119 -0
- data/ext/nokogiri/html4_sax_push_parser.c +95 -0
- data/ext/nokogiri/libxml2_backwards_compat.c +121 -0
- data/ext/nokogiri/nokogiri.c +228 -91
- data/ext/nokogiri/nokogiri.h +199 -88
- data/ext/nokogiri/test_global_handlers.c +40 -0
- data/ext/nokogiri/xml_attr.c +42 -37
- data/ext/nokogiri/xml_attribute_decl.c +21 -21
- data/ext/nokogiri/xml_cdata.c +14 -19
- data/ext/nokogiri/xml_comment.c +19 -26
- data/ext/nokogiri/xml_document.c +296 -217
- data/ext/nokogiri/xml_document_fragment.c +12 -16
- data/ext/nokogiri/xml_dtd.c +64 -58
- data/ext/nokogiri/xml_element_content.c +31 -26
- data/ext/nokogiri/xml_element_decl.c +25 -25
- data/ext/nokogiri/xml_encoding_handler.c +43 -18
- data/ext/nokogiri/xml_entity_decl.c +37 -35
- data/ext/nokogiri/xml_entity_reference.c +16 -18
- data/ext/nokogiri/xml_namespace.c +99 -54
- data/ext/nokogiri/xml_node.c +1107 -658
- data/ext/nokogiri/xml_node_set.c +178 -166
- data/ext/nokogiri/xml_processing_instruction.c +17 -19
- data/ext/nokogiri/xml_reader.c +277 -175
- data/ext/nokogiri/xml_relax_ng.c +52 -28
- data/ext/nokogiri/xml_sax_parser.c +112 -112
- data/ext/nokogiri/xml_sax_parser_context.c +112 -86
- data/ext/nokogiri/xml_sax_push_parser.c +36 -27
- data/ext/nokogiri/xml_schema.c +114 -35
- data/ext/nokogiri/xml_syntax_error.c +42 -21
- data/ext/nokogiri/xml_text.c +14 -18
- data/ext/nokogiri/xml_xpath_context.c +226 -115
- data/ext/nokogiri/xslt_stylesheet.c +265 -173
- data/gumbo-parser/CHANGES.md +63 -0
- data/gumbo-parser/Makefile +101 -0
- data/gumbo-parser/THANKS +27 -0
- data/gumbo-parser/src/Makefile +34 -0
- data/gumbo-parser/src/README.md +41 -0
- data/gumbo-parser/src/ascii.c +75 -0
- data/gumbo-parser/src/ascii.h +115 -0
- data/gumbo-parser/src/attribute.c +42 -0
- data/gumbo-parser/src/attribute.h +17 -0
- data/gumbo-parser/src/char_ref.c +22225 -0
- data/gumbo-parser/src/char_ref.h +29 -0
- data/gumbo-parser/src/char_ref.rl +2154 -0
- data/gumbo-parser/src/error.c +626 -0
- data/gumbo-parser/src/error.h +148 -0
- data/gumbo-parser/src/foreign_attrs.c +104 -0
- data/gumbo-parser/src/foreign_attrs.gperf +27 -0
- data/gumbo-parser/src/gumbo.h +943 -0
- data/gumbo-parser/src/insertion_mode.h +33 -0
- data/gumbo-parser/src/macros.h +91 -0
- data/gumbo-parser/src/parser.c +4875 -0
- data/gumbo-parser/src/parser.h +41 -0
- data/gumbo-parser/src/replacement.h +33 -0
- data/gumbo-parser/src/string_buffer.c +103 -0
- data/gumbo-parser/src/string_buffer.h +68 -0
- data/gumbo-parser/src/string_piece.c +48 -0
- data/gumbo-parser/src/svg_attrs.c +174 -0
- data/gumbo-parser/src/svg_attrs.gperf +77 -0
- data/gumbo-parser/src/svg_tags.c +137 -0
- data/gumbo-parser/src/svg_tags.gperf +55 -0
- data/gumbo-parser/src/tag.c +222 -0
- data/gumbo-parser/src/tag_lookup.c +382 -0
- data/gumbo-parser/src/tag_lookup.gperf +169 -0
- data/gumbo-parser/src/tag_lookup.h +13 -0
- data/gumbo-parser/src/token_buffer.c +79 -0
- data/gumbo-parser/src/token_buffer.h +71 -0
- data/gumbo-parser/src/token_type.h +17 -0
- data/gumbo-parser/src/tokenizer.c +3463 -0
- data/gumbo-parser/src/tokenizer.h +112 -0
- data/gumbo-parser/src/tokenizer_states.h +339 -0
- data/gumbo-parser/src/utf8.c +245 -0
- data/gumbo-parser/src/utf8.h +164 -0
- data/gumbo-parser/src/util.c +68 -0
- data/gumbo-parser/src/util.h +30 -0
- data/gumbo-parser/src/vector.c +111 -0
- data/gumbo-parser/src/vector.h +45 -0
- data/lib/nokogiri/class_resolver.rb +67 -0
- data/lib/nokogiri/css/node.rb +10 -8
- data/lib/nokogiri/css/parser.rb +397 -377
- data/lib/nokogiri/css/parser.y +250 -245
- data/lib/nokogiri/css/parser_extras.rb +54 -49
- data/lib/nokogiri/css/syntax_error.rb +3 -1
- data/lib/nokogiri/css/tokenizer.rb +107 -104
- data/lib/nokogiri/css/tokenizer.rex +3 -2
- data/lib/nokogiri/css/xpath_visitor.rb +218 -91
- data/lib/nokogiri/css.rb +50 -17
- data/lib/nokogiri/decorators/slop.rb +9 -7
- data/lib/nokogiri/extension.rb +31 -0
- data/lib/nokogiri/gumbo.rb +15 -0
- data/lib/nokogiri/html.rb +38 -27
- data/lib/nokogiri/{html → html4}/builder.rb +4 -2
- data/lib/nokogiri/{html → html4}/document.rb +103 -105
- data/lib/nokogiri/html4/document_fragment.rb +54 -0
- data/lib/nokogiri/{html → html4}/element_description.rb +3 -1
- data/lib/nokogiri/html4/element_description_defaults.rb +578 -0
- data/lib/nokogiri/{html → html4}/entity_lookup.rb +4 -2
- data/lib/nokogiri/{html → html4}/sax/parser.rb +17 -16
- data/lib/nokogiri/html4/sax/parser_context.rb +20 -0
- data/lib/nokogiri/{html → html4}/sax/push_parser.rb +12 -11
- data/lib/nokogiri/html4.rb +46 -0
- data/lib/nokogiri/html5/document.rb +91 -0
- data/lib/nokogiri/html5/document_fragment.rb +83 -0
- data/lib/nokogiri/html5/node.rb +100 -0
- data/lib/nokogiri/html5.rb +478 -0
- data/lib/nokogiri/jruby/dependencies.rb +21 -0
- data/lib/nokogiri/syntax_error.rb +2 -0
- data/lib/nokogiri/version/constant.rb +6 -0
- data/lib/nokogiri/version/info.rb +222 -0
- data/lib/nokogiri/version.rb +3 -108
- data/lib/nokogiri/xml/attr.rb +6 -3
- data/lib/nokogiri/xml/attribute_decl.rb +3 -1
- data/lib/nokogiri/xml/builder.rb +97 -53
- data/lib/nokogiri/xml/cdata.rb +3 -1
- data/lib/nokogiri/xml/character_data.rb +2 -0
- data/lib/nokogiri/xml/document.rb +224 -86
- data/lib/nokogiri/xml/document_fragment.rb +57 -44
- data/lib/nokogiri/xml/dtd.rb +4 -2
- data/lib/nokogiri/xml/element_content.rb +2 -0
- data/lib/nokogiri/xml/element_decl.rb +3 -1
- data/lib/nokogiri/xml/entity_decl.rb +4 -2
- data/lib/nokogiri/xml/entity_reference.rb +2 -0
- data/lib/nokogiri/xml/namespace.rb +3 -0
- data/lib/nokogiri/xml/node/save_options.rb +10 -5
- data/lib/nokogiri/xml/node.rb +895 -377
- data/lib/nokogiri/xml/node_set.rb +92 -65
- data/lib/nokogiri/xml/notation.rb +13 -0
- data/lib/nokogiri/xml/parse_options.rb +22 -8
- data/lib/nokogiri/xml/pp/character_data.rb +9 -6
- data/lib/nokogiri/xml/pp/node.rb +25 -26
- data/lib/nokogiri/xml/pp.rb +4 -2
- data/lib/nokogiri/xml/processing_instruction.rb +3 -1
- data/lib/nokogiri/xml/reader.rb +21 -28
- data/lib/nokogiri/xml/relax_ng.rb +8 -2
- data/lib/nokogiri/xml/sax/document.rb +45 -49
- data/lib/nokogiri/xml/sax/parser.rb +38 -34
- data/lib/nokogiri/xml/sax/parser_context.rb +8 -3
- data/lib/nokogiri/xml/sax/push_parser.rb +6 -5
- data/lib/nokogiri/xml/sax.rb +6 -4
- data/lib/nokogiri/xml/schema.rb +19 -9
- data/lib/nokogiri/xml/searchable.rb +112 -72
- data/lib/nokogiri/xml/syntax_error.rb +6 -4
- data/lib/nokogiri/xml/text.rb +2 -0
- data/lib/nokogiri/xml/xpath/syntax_error.rb +4 -2
- data/lib/nokogiri/xml/xpath.rb +15 -4
- data/lib/nokogiri/xml/xpath_context.rb +3 -3
- data/lib/nokogiri/xml.rb +38 -37
- data/lib/nokogiri/xslt/stylesheet.rb +3 -1
- data/lib/nokogiri/xslt.rb +29 -20
- data/lib/nokogiri.rb +49 -65
- data/lib/xsd/xmlparser/nokogiri.rb +26 -24
- data/patches/libxml2/0001-Remove-script-macro-support.patch +40 -0
- data/patches/libxml2/0002-Update-entities-to-remove-handling-of-ssi.patch +44 -0
- data/patches/libxml2/0003-libxml2.la-is-in-top_builddir.patch +25 -0
- data/patches/libxml2/0005-avoid-isnan-isinf.patch +81 -0
- data/patches/libxml2/0009-allow-wildcard-namespaces.patch +77 -0
- data/patches/libxslt/0001-update-automake-files-for-arm64.patch +3037 -0
- data/ports/archives/libxml2-2.10.3.tar.xz +0 -0
- data/ports/archives/libxslt-1.1.37.tar.xz +0 -0
- metadata +211 -266
- data/.autotest +0 -22
- data/.cross_rubies +0 -8
- data/.editorconfig +0 -17
- data/.gemtest +0 -0
- data/.travis.yml +0 -63
- data/CHANGELOG.md +0 -1368
- data/CONTRIBUTING.md +0 -42
- data/C_CODING_STYLE.rdoc +0 -33
- data/Gemfile-libxml-ruby +0 -3
- data/Manifest.txt +0 -370
- data/ROADMAP.md +0 -111
- data/Rakefile +0 -348
- data/SECURITY.md +0 -19
- data/STANDARD_RESPONSES.md +0 -47
- data/Y_U_NO_GEMSPEC.md +0 -155
- data/appveyor.yml +0 -29
- data/build_all +0 -44
- data/ext/nokogiri/html_document.c +0 -170
- data/ext/nokogiri/html_document.h +0 -10
- data/ext/nokogiri/html_element_description.c +0 -279
- data/ext/nokogiri/html_element_description.h +0 -10
- data/ext/nokogiri/html_entity_lookup.c +0 -32
- data/ext/nokogiri/html_entity_lookup.h +0 -8
- data/ext/nokogiri/html_sax_parser_context.c +0 -116
- data/ext/nokogiri/html_sax_parser_context.h +0 -11
- data/ext/nokogiri/html_sax_push_parser.c +0 -87
- data/ext/nokogiri/html_sax_push_parser.h +0 -9
- data/ext/nokogiri/xml_attr.h +0 -9
- data/ext/nokogiri/xml_attribute_decl.h +0 -9
- data/ext/nokogiri/xml_cdata.h +0 -9
- data/ext/nokogiri/xml_comment.h +0 -9
- data/ext/nokogiri/xml_document.h +0 -23
- data/ext/nokogiri/xml_document_fragment.h +0 -10
- data/ext/nokogiri/xml_dtd.h +0 -10
- data/ext/nokogiri/xml_element_content.h +0 -10
- data/ext/nokogiri/xml_element_decl.h +0 -9
- data/ext/nokogiri/xml_encoding_handler.h +0 -8
- data/ext/nokogiri/xml_entity_decl.h +0 -10
- data/ext/nokogiri/xml_entity_reference.h +0 -9
- data/ext/nokogiri/xml_io.c +0 -61
- data/ext/nokogiri/xml_io.h +0 -11
- data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
- data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
- data/ext/nokogiri/xml_namespace.h +0 -15
- data/ext/nokogiri/xml_node.h +0 -13
- data/ext/nokogiri/xml_node_set.h +0 -12
- data/ext/nokogiri/xml_processing_instruction.h +0 -9
- data/ext/nokogiri/xml_reader.h +0 -10
- data/ext/nokogiri/xml_relax_ng.h +0 -9
- data/ext/nokogiri/xml_sax_parser.h +0 -39
- data/ext/nokogiri/xml_sax_parser_context.h +0 -10
- data/ext/nokogiri/xml_sax_push_parser.h +0 -9
- data/ext/nokogiri/xml_schema.h +0 -9
- data/ext/nokogiri/xml_syntax_error.h +0 -13
- data/ext/nokogiri/xml_text.h +0 -9
- data/ext/nokogiri/xml_xpath_context.h +0 -10
- data/ext/nokogiri/xslt_stylesheet.h +0 -14
- data/lib/nokogiri/html/document_fragment.rb +0 -49
- data/lib/nokogiri/html/element_description_defaults.rb +0 -671
- data/lib/nokogiri/html/sax/parser_context.rb +0 -16
- data/patches/libxml2/0001-Revert-Do-not-URI-escape-in-server-side-includes.patch +0 -78
- data/patches/libxml2/0002-Fix-nullptr-deref-with-XPath-logic-ops.patch +0 -54
- data/patches/libxml2/0003-Fix-infinite-loop-in-LZMA-decompression.patch +0 -50
- data/patches/sort-patches-by-date +0 -25
- data/ports/archives/libxml2-2.9.8.tar.gz +0 -0
- data/ports/archives/libxslt-1.1.32.tar.gz +0 -0
- data/suppressions/README.txt +0 -1
- data/suppressions/nokogiri_ruby-2.supp +0 -10
- data/tasks/test.rb +0 -100
- data/test/css/test_nthiness.rb +0 -226
- data/test/css/test_parser.rb +0 -386
- data/test/css/test_tokenizer.rb +0 -215
- data/test/css/test_xpath_visitor.rb +0 -96
- data/test/decorators/test_slop.rb +0 -23
- data/test/files/2ch.html +0 -108
- data/test/files/GH_1042.html +0 -18
- data/test/files/address_book.rlx +0 -12
- data/test/files/address_book.xml +0 -10
- data/test/files/atom.xml +0 -344
- data/test/files/bar/bar.xsd +0 -4
- data/test/files/bogus.xml +0 -0
- data/test/files/dont_hurt_em_why.xml +0 -422
- data/test/files/encoding.html +0 -82
- data/test/files/encoding.xhtml +0 -84
- data/test/files/exslt.xml +0 -8
- data/test/files/exslt.xslt +0 -35
- data/test/files/foo/foo.xsd +0 -4
- data/test/files/metacharset.html +0 -10
- data/test/files/namespace_pressure_test.xml +0 -1684
- data/test/files/noencoding.html +0 -47
- data/test/files/po.xml +0 -32
- data/test/files/po.xsd +0 -66
- data/test/files/saml/saml20assertion_schema.xsd +0 -283
- data/test/files/saml/saml20protocol_schema.xsd +0 -302
- data/test/files/saml/xenc_schema.xsd +0 -146
- data/test/files/saml/xmldsig_schema.xsd +0 -318
- data/test/files/shift_jis.html +0 -10
- data/test/files/shift_jis.xml +0 -5
- data/test/files/shift_jis_no_charset.html +0 -9
- data/test/files/slow-xpath.xml +0 -25509
- data/test/files/snuggles.xml +0 -3
- data/test/files/staff.dtd +0 -10
- data/test/files/staff.xml +0 -59
- data/test/files/staff.xslt +0 -32
- data/test/files/test_document_url/bar.xml +0 -2
- data/test/files/test_document_url/document.dtd +0 -4
- data/test/files/test_document_url/document.xml +0 -6
- data/test/files/tlm.html +0 -851
- data/test/files/to_be_xincluded.xml +0 -2
- data/test/files/valid_bar.xml +0 -2
- data/test/files/xinclude.xml +0 -4
- data/test/helper.rb +0 -271
- data/test/html/sax/test_parser.rb +0 -168
- data/test/html/sax/test_parser_context.rb +0 -46
- data/test/html/sax/test_parser_text.rb +0 -163
- data/test/html/sax/test_push_parser.rb +0 -87
- data/test/html/test_attributes.rb +0 -85
- data/test/html/test_builder.rb +0 -164
- data/test/html/test_document.rb +0 -712
- data/test/html/test_document_encoding.rb +0 -143
- data/test/html/test_document_fragment.rb +0 -310
- data/test/html/test_element_description.rb +0 -105
- data/test/html/test_named_characters.rb +0 -14
- data/test/html/test_node.rb +0 -212
- data/test/html/test_node_encoding.rb +0 -91
- data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +0 -14
- data/test/namespaces/test_namespaces_aliased_default.rb +0 -24
- data/test/namespaces/test_namespaces_in_builder_doc.rb +0 -75
- data/test/namespaces/test_namespaces_in_cloned_doc.rb +0 -31
- data/test/namespaces/test_namespaces_in_created_doc.rb +0 -75
- data/test/namespaces/test_namespaces_in_parsed_doc.rb +0 -80
- data/test/namespaces/test_namespaces_preservation.rb +0 -31
- data/test/test_convert_xpath.rb +0 -135
- data/test/test_css_cache.rb +0 -47
- data/test/test_encoding_handler.rb +0 -48
- data/test/test_memory_leak.rb +0 -156
- data/test/test_nokogiri.rb +0 -138
- data/test/test_soap4r_sax.rb +0 -52
- data/test/test_xslt_transforms.rb +0 -314
- data/test/xml/node/test_save_options.rb +0 -28
- data/test/xml/node/test_subclass.rb +0 -44
- data/test/xml/sax/test_parser.rb +0 -402
- data/test/xml/sax/test_parser_context.rb +0 -115
- data/test/xml/sax/test_parser_text.rb +0 -202
- data/test/xml/sax/test_push_parser.rb +0 -265
- data/test/xml/test_attr.rb +0 -74
- data/test/xml/test_attribute_decl.rb +0 -86
- data/test/xml/test_builder.rb +0 -341
- data/test/xml/test_c14n.rb +0 -180
- data/test/xml/test_cdata.rb +0 -54
- data/test/xml/test_comment.rb +0 -40
- data/test/xml/test_document.rb +0 -982
- data/test/xml/test_document_encoding.rb +0 -31
- data/test/xml/test_document_fragment.rb +0 -298
- data/test/xml/test_dtd.rb +0 -187
- data/test/xml/test_dtd_encoding.rb +0 -31
- data/test/xml/test_element_content.rb +0 -56
- data/test/xml/test_element_decl.rb +0 -73
- data/test/xml/test_entity_decl.rb +0 -122
- data/test/xml/test_entity_reference.rb +0 -262
- data/test/xml/test_namespace.rb +0 -96
- data/test/xml/test_node.rb +0 -1325
- data/test/xml/test_node_attributes.rb +0 -115
- data/test/xml/test_node_encoding.rb +0 -75
- data/test/xml/test_node_inheritance.rb +0 -32
- data/test/xml/test_node_reparenting.rb +0 -592
- data/test/xml/test_node_set.rb +0 -809
- data/test/xml/test_parse_options.rb +0 -64
- data/test/xml/test_processing_instruction.rb +0 -30
- data/test/xml/test_reader.rb +0 -620
- data/test/xml/test_reader_encoding.rb +0 -134
- data/test/xml/test_relax_ng.rb +0 -60
- data/test/xml/test_schema.rb +0 -142
- data/test/xml/test_syntax_error.rb +0 -36
- data/test/xml/test_text.rb +0 -60
- data/test/xml/test_unparented_node.rb +0 -483
- data/test/xml/test_xinclude.rb +0 -83
- data/test/xml/test_xpath.rb +0 -470
- data/test/xslt/test_custom_functions.rb +0 -133
- data/test/xslt/test_exception_handling.rb +0 -37
data/test/xml/test_xpath.rb
DELETED
@@ -1,470 +0,0 @@
|
|
1
|
-
require "helper"
|
2
|
-
|
3
|
-
module Nokogiri
|
4
|
-
module XML
|
5
|
-
class TestXPath < Nokogiri::TestCase
|
6
|
-
|
7
|
-
# ** WHY ALL THOSE _if Nokogiri.uses_libxml?_ **
|
8
|
-
# Hi, my dear readers,
|
9
|
-
#
|
10
|
-
# After reading these tests you may be wondering why all those ugly
|
11
|
-
# if Nokogiri.uses_libxml? sparsed over the whole document. Well, let
|
12
|
-
# me explain it. While using XPath in Java, you need the extension
|
13
|
-
# functions to be in a namespace. This is not required by XPath, afaik,
|
14
|
-
# but it is an usual convention though.
|
15
|
-
#
|
16
|
-
# Yours truly,
|
17
|
-
#
|
18
|
-
# The guy whose headaches belong to Nokogiri JRuby impl.
|
19
|
-
|
20
|
-
|
21
|
-
def setup
|
22
|
-
super
|
23
|
-
|
24
|
-
@xml = Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE)
|
25
|
-
|
26
|
-
@ns = @xml.root.namespaces
|
27
|
-
|
28
|
-
# TODO: Maybe I should move this to the original code.
|
29
|
-
@ns["nokogiri"] = "http://www.nokogiri.org/default_ns/ruby/extensions_functions"
|
30
|
-
|
31
|
-
@handler = Class.new {
|
32
|
-
attr_reader :things
|
33
|
-
|
34
|
-
def initialize
|
35
|
-
@things = []
|
36
|
-
end
|
37
|
-
|
38
|
-
def thing thing
|
39
|
-
@things << thing
|
40
|
-
thing
|
41
|
-
end
|
42
|
-
|
43
|
-
def returns_array node_set
|
44
|
-
@things << node_set.to_a
|
45
|
-
node_set.to_a
|
46
|
-
end
|
47
|
-
|
48
|
-
def my_filter set, attribute, value
|
49
|
-
set.find_all { |x| x[attribute] == value }
|
50
|
-
end
|
51
|
-
|
52
|
-
def saves_node_set node_set
|
53
|
-
@things = node_set
|
54
|
-
end
|
55
|
-
|
56
|
-
def value
|
57
|
-
123.456
|
58
|
-
end
|
59
|
-
|
60
|
-
def anint
|
61
|
-
1230456
|
62
|
-
end
|
63
|
-
}.new
|
64
|
-
end
|
65
|
-
|
66
|
-
def test_variable_binding
|
67
|
-
assert_equal 4, @xml.xpath('//address[@domestic=$value]', nil, :value => 'Yes').length
|
68
|
-
end
|
69
|
-
|
70
|
-
def test_variable_binding_with_search
|
71
|
-
assert_equal 4, @xml.search('//address[@domestic=$value]', nil, :value => 'Yes').length
|
72
|
-
end
|
73
|
-
|
74
|
-
def test_unknown_attribute
|
75
|
-
assert_equal 0, @xml.xpath('//employee[@id="asdfasdf"]/@fooo').length
|
76
|
-
assert_nil @xml.xpath('//employee[@id="asdfasdf"]/@fooo')[0]
|
77
|
-
end
|
78
|
-
|
79
|
-
def test_boolean
|
80
|
-
assert_equal false, @xml.xpath('1 = 2')
|
81
|
-
end
|
82
|
-
|
83
|
-
def test_number
|
84
|
-
assert_equal 2, @xml.xpath('1 + 1')
|
85
|
-
end
|
86
|
-
|
87
|
-
def test_string
|
88
|
-
assert_equal 'foo', @xml.xpath('concat("fo", "o")')
|
89
|
-
end
|
90
|
-
|
91
|
-
def test_node_search_with_multiple_queries
|
92
|
-
xml = '<document>
|
93
|
-
<thing>
|
94
|
-
<div class="title">important thing</div>
|
95
|
-
</thing>
|
96
|
-
<thing>
|
97
|
-
<div class="content">stuff</div>
|
98
|
-
</thing>
|
99
|
-
<thing>
|
100
|
-
<p class="blah">more stuff</div>
|
101
|
-
</thing>
|
102
|
-
</document>'
|
103
|
-
node = Nokogiri::XML(xml).root
|
104
|
-
assert_kind_of Nokogiri::XML::Node, node
|
105
|
-
|
106
|
-
assert_equal 3, node.xpath('.//div', './/p').length
|
107
|
-
assert_equal 3, node.css('.title', '.content', 'p').length
|
108
|
-
assert_equal 3, node.search('.//div', 'p.blah').length
|
109
|
-
end
|
110
|
-
|
111
|
-
def test_css_search_with_ambiguous_integer_or_string_attributes
|
112
|
-
# https://github.com/sparklemotion/nokogiri/issues/711
|
113
|
-
html = "<body><div><img width=200>"
|
114
|
-
doc = Nokogiri::HTML(html)
|
115
|
-
assert_not_nil doc.at_css("img[width='200']")
|
116
|
-
assert_not_nil doc.at_css("img[width=200]")
|
117
|
-
end
|
118
|
-
|
119
|
-
def test_css_search_uses_custom_selectors_with_arguments
|
120
|
-
set = @xml.css('employee > address:my_filter("domestic", "Yes")', @handler)
|
121
|
-
assert set.length > 0
|
122
|
-
set.each do |node|
|
123
|
-
assert_equal 'Yes', node['domestic']
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
def test_css_search_uses_custom_selectors
|
128
|
-
set = @xml.xpath('//employee')
|
129
|
-
@xml.css('employee:thing()', @handler)
|
130
|
-
assert_equal(set.length, @handler.things.length)
|
131
|
-
assert_equal(set.to_a, @handler.things.flatten)
|
132
|
-
end
|
133
|
-
|
134
|
-
def test_search_with_css_query_uses_custom_selectors_with_arguments
|
135
|
-
set = @xml.search('employee > address:my_filter("domestic", "Yes")', @handler)
|
136
|
-
assert set.length > 0
|
137
|
-
set.each do |node|
|
138
|
-
assert_equal 'Yes', node['domestic']
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
|
-
def test_search_with_xpath_query_uses_custom_selectors_with_arguments
|
143
|
-
set = if Nokogiri.uses_libxml?
|
144
|
-
@xml.search('//employee/address[my_filter(., "domestic", "Yes")]', @handler)
|
145
|
-
else
|
146
|
-
@xml.search('//employee/address[nokogiri:my_filter(., "domestic", "Yes")]', @ns, @handler)
|
147
|
-
end
|
148
|
-
assert set.length > 0
|
149
|
-
set.each do |node|
|
150
|
-
assert_equal 'Yes', node['domestic']
|
151
|
-
end
|
152
|
-
end
|
153
|
-
|
154
|
-
def test_pass_self_to_function
|
155
|
-
set = if Nokogiri.uses_libxml?
|
156
|
-
@xml.xpath('//employee/address[my_filter(., "domestic", "Yes")]', @handler)
|
157
|
-
else
|
158
|
-
@xml.xpath('//employee/address[nokogiri:my_filter(., "domestic", "Yes")]', @ns, @handler)
|
159
|
-
end
|
160
|
-
assert set.length > 0
|
161
|
-
set.each do |node|
|
162
|
-
assert_equal 'Yes', node['domestic']
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
|
-
def test_custom_xpath_function_gets_strings
|
167
|
-
set = @xml.xpath('//employee')
|
168
|
-
if Nokogiri.uses_libxml?
|
169
|
-
@xml.xpath('//employee[thing("asdf")]', @handler)
|
170
|
-
else
|
171
|
-
@xml.xpath('//employee[nokogiri:thing("asdf")]', @ns, @handler)
|
172
|
-
end
|
173
|
-
assert_equal(set.length, @handler.things.length)
|
174
|
-
assert_equal(['asdf'] * set.length, @handler.things)
|
175
|
-
end
|
176
|
-
|
177
|
-
def parse_params node
|
178
|
-
params={}
|
179
|
-
node.xpath('./param').each do |p|
|
180
|
-
subparams = parse_params p
|
181
|
-
if(subparams.length > 0)
|
182
|
-
if(not params.has_key? p.attributes['name'].value)
|
183
|
-
params[p.attributes['name'].value] = subparams
|
184
|
-
else
|
185
|
-
if(params[p.attributes['name'].value].is_a? Array)
|
186
|
-
params[p.attributes['name'].value] << subparams
|
187
|
-
else
|
188
|
-
value = params[p.attributes['name'].value]
|
189
|
-
params[p.attributes['name'].value] = [value,subparams]
|
190
|
-
end
|
191
|
-
end
|
192
|
-
else
|
193
|
-
params[p.attributes['name'].value]=p.text
|
194
|
-
end
|
195
|
-
end
|
196
|
-
params
|
197
|
-
end
|
198
|
-
|
199
|
-
# issue #741 (xpath() around 10x slower in JRuby)
|
200
|
-
def test_slow_jruby_xpath
|
201
|
-
skip("testing against an absolute time is brittle. help make this better! see https://github.com/sparklemotion/nokogiri/issues/741")
|
202
|
-
|
203
|
-
doc = Nokogiri::XML(File.open(XPATH_FILE))
|
204
|
-
start = Time.now
|
205
|
-
|
206
|
-
doc.xpath('.//category').each do |c|
|
207
|
-
c.xpath('programformats/programformat').each do |p|
|
208
|
-
p.xpath('./modules/module').each do |m|
|
209
|
-
parse_params m
|
210
|
-
end
|
211
|
-
end
|
212
|
-
end
|
213
|
-
stop = Time.now
|
214
|
-
elapsed_time = stop - start
|
215
|
-
time_limit = 20
|
216
|
-
assert_send [elapsed_time, :<, time_limit], "XPath is taking too long"
|
217
|
-
end
|
218
|
-
|
219
|
-
# issue #1109 (jruby impl's xpath() cache not being cleared on attr removal)
|
220
|
-
def test_xpath_results_cache_should_get_cleared_on_attr_removal
|
221
|
-
doc = Nokogiri::HTML('<html><div name="foo"></div></html>')
|
222
|
-
element = doc.at_xpath('//div[@name="foo"]')
|
223
|
-
element.remove_attribute('name')
|
224
|
-
assert_nil doc.at_xpath('//div[@name="foo"]')
|
225
|
-
end
|
226
|
-
|
227
|
-
# issue #1109 (jruby impl's xpath() cache not being cleared on attr update )
|
228
|
-
def test_xpath_results_cache_should_get_cleared_on_attr_update
|
229
|
-
doc = Nokogiri::HTML('<html><div name="foo"></div></html>')
|
230
|
-
element = doc.at_xpath('//div[@name="foo"]')
|
231
|
-
element['name'] = 'bar'
|
232
|
-
assert_nil doc.at_xpath('//div[@name="foo"]')
|
233
|
-
end
|
234
|
-
|
235
|
-
def test_custom_xpath_function_returns_string
|
236
|
-
if Nokogiri.uses_libxml?
|
237
|
-
result = @xml.xpath('thing("asdf")', @handler)
|
238
|
-
else
|
239
|
-
result = @xml.xpath('nokogiri:thing("asdf")', @ns, @handler)
|
240
|
-
end
|
241
|
-
assert_equal 'asdf', result
|
242
|
-
end
|
243
|
-
|
244
|
-
def test_custom_xpath_gets_true_booleans
|
245
|
-
set = @xml.xpath('//employee')
|
246
|
-
if Nokogiri.uses_libxml?
|
247
|
-
@xml.xpath('//employee[thing(true())]', @handler)
|
248
|
-
else
|
249
|
-
@xml.xpath("//employee[nokogiri:thing(true())]", @ns, @handler)
|
250
|
-
end
|
251
|
-
assert_equal(set.length, @handler.things.length)
|
252
|
-
assert_equal([true] * set.length, @handler.things)
|
253
|
-
end
|
254
|
-
|
255
|
-
def test_custom_xpath_gets_false_booleans
|
256
|
-
set = @xml.xpath('//employee')
|
257
|
-
if Nokogiri.uses_libxml?
|
258
|
-
@xml.xpath('//employee[thing(false())]', @handler)
|
259
|
-
else
|
260
|
-
@xml.xpath("//employee[nokogiri:thing(false())]", @ns, @handler)
|
261
|
-
end
|
262
|
-
assert_equal(set.length, @handler.things.length)
|
263
|
-
assert_equal([false] * set.length, @handler.things)
|
264
|
-
end
|
265
|
-
|
266
|
-
def test_custom_xpath_gets_numbers
|
267
|
-
set = @xml.xpath('//employee')
|
268
|
-
if Nokogiri.uses_libxml?
|
269
|
-
@xml.xpath('//employee[thing(10)]', @handler)
|
270
|
-
else
|
271
|
-
@xml.xpath('//employee[nokogiri:thing(10)]', @ns, @handler)
|
272
|
-
end
|
273
|
-
assert_equal(set.length, @handler.things.length)
|
274
|
-
assert_equal([10] * set.length, @handler.things)
|
275
|
-
end
|
276
|
-
|
277
|
-
def test_custom_xpath_gets_node_sets
|
278
|
-
set = @xml.xpath('//employee/name')
|
279
|
-
if Nokogiri.uses_libxml?
|
280
|
-
@xml.xpath('//employee[thing(name)]', @handler)
|
281
|
-
else
|
282
|
-
@xml.xpath('//employee[nokogiri:thing(name)]', @ns, @handler)
|
283
|
-
end
|
284
|
-
assert_equal(set.length, @handler.things.length)
|
285
|
-
assert_equal(set.to_a, @handler.things.flatten)
|
286
|
-
end
|
287
|
-
|
288
|
-
def test_custom_xpath_gets_node_sets_and_returns_array
|
289
|
-
set = @xml.xpath('//employee/name')
|
290
|
-
if Nokogiri.uses_libxml?
|
291
|
-
@xml.xpath('//employee[returns_array(name)]', @handler)
|
292
|
-
else
|
293
|
-
@xml.xpath('//employee[nokogiri:returns_array(name)]', @ns, @handler)
|
294
|
-
end
|
295
|
-
assert_equal(set.length, @handler.things.length)
|
296
|
-
assert_equal(set.to_a, @handler.things.flatten)
|
297
|
-
end
|
298
|
-
|
299
|
-
def test_custom_xpath_handler_is_passed_a_decorated_node_set
|
300
|
-
x = Module.new do
|
301
|
-
def awesome! ; end
|
302
|
-
end
|
303
|
-
util_decorate(@xml, x)
|
304
|
-
|
305
|
-
assert @xml.xpath('//employee/name')
|
306
|
-
|
307
|
-
@xml.xpath('//employee[saves_node_set(name)]', @handler)
|
308
|
-
assert_equal @xml, @handler.things.document
|
309
|
-
assert @handler.things.respond_to?(:awesome!)
|
310
|
-
end
|
311
|
-
|
312
|
-
def test_code_that_invokes_OP_RESET_inside_libxml2
|
313
|
-
doc = "<html><body id='foo'><foo>hi</foo></body></html>"
|
314
|
-
xpath = 'id("foo")//foo'
|
315
|
-
nokogiri = Nokogiri::HTML.parse(doc)
|
316
|
-
assert nokogiri.xpath(xpath)
|
317
|
-
end
|
318
|
-
|
319
|
-
def test_custom_xpath_handler_with_args_under_gc_pressure
|
320
|
-
# see http://github.com/sparklemotion/nokogiri/issues/#issue/345
|
321
|
-
tool_inspector = Class.new do
|
322
|
-
def name_equals(nodeset, name, *args)
|
323
|
-
nodeset.all? do |node|
|
324
|
-
args.each { |thing| thing.inspect }
|
325
|
-
node["name"] == name
|
326
|
-
end
|
327
|
-
end
|
328
|
-
end.new
|
329
|
-
|
330
|
-
xml = <<-EOXML
|
331
|
-
<toolbox>
|
332
|
-
#{"<tool name='hammer'/><tool name='wrench'/>" * 10}
|
333
|
-
</toolbox>
|
334
|
-
EOXML
|
335
|
-
doc = Nokogiri::XML xml
|
336
|
-
|
337
|
-
# long list of long arguments, to apply GC pressure during
|
338
|
-
# ruby_funcall argument marshalling
|
339
|
-
xpath = ["//tool[name_equals(.,'hammer'"]
|
340
|
-
1000.times { xpath << "'unused argument #{'x' * 1000}'" }
|
341
|
-
xpath << "'unused argument')]"
|
342
|
-
xpath = xpath.join(',')
|
343
|
-
|
344
|
-
assert_equal doc.xpath("//tool[@name='hammer']"), doc.xpath(xpath, tool_inspector)
|
345
|
-
end
|
346
|
-
|
347
|
-
def test_custom_xpath_without_arguments
|
348
|
-
if Nokogiri.uses_libxml?
|
349
|
-
value = @xml.xpath('value()', @handler)
|
350
|
-
else
|
351
|
-
value = @xml.xpath('nokogiri:value()', @ns, @handler)
|
352
|
-
end
|
353
|
-
assert_equal 123.456, value
|
354
|
-
end
|
355
|
-
|
356
|
-
def test_custom_xpath_without_arguments_returning_int
|
357
|
-
if Nokogiri.uses_libxml?
|
358
|
-
value = @xml.xpath('anint()', @handler)
|
359
|
-
else
|
360
|
-
value = @xml.xpath('nokogiri:anint()', @ns, @handler)
|
361
|
-
end
|
362
|
-
assert_equal 1230456, value
|
363
|
-
end
|
364
|
-
|
365
|
-
def test_custom_xpath_with_bullshit_arguments
|
366
|
-
xml = %q{<foo> </foo>}
|
367
|
-
doc = Nokogiri::XML.parse(xml)
|
368
|
-
foo = doc.xpath('//foo[bool_function(bar/baz)]', Class.new {
|
369
|
-
def bool_function(value)
|
370
|
-
true
|
371
|
-
end
|
372
|
-
}.new)
|
373
|
-
assert_equal foo, doc.xpath("//foo")
|
374
|
-
end
|
375
|
-
|
376
|
-
def test_node_set_should_be_decorated
|
377
|
-
# "called decorate on nill" exception in JRuby issue#514
|
378
|
-
process_output= <<END
|
379
|
-
<test>
|
380
|
-
<track type="Image">
|
381
|
-
<Format>LZ77</Format>
|
382
|
-
</test>
|
383
|
-
END
|
384
|
-
doc = Nokogiri::XML.parse(process_output)
|
385
|
-
node = doc.xpath(%{//track[@type='Video']})
|
386
|
-
assert_equal "[]", node.xpath("Format").inspect
|
387
|
-
end
|
388
|
-
|
389
|
-
def test_very_specific_xml_xpath_making_problems_in_jruby
|
390
|
-
# manually merges pull request #681
|
391
|
-
xml_string = %q{<?xml version="1.0" encoding="UTF-8"?>
|
392
|
-
<ONIXMessage xmlns:elibri="http://elibri.com.pl/ns/extensions" release="3.0" xmlns="http://www.editeur.org/onix/3.0/reference">
|
393
|
-
<Product>
|
394
|
-
<RecordReference>a</RecordReference>
|
395
|
-
</Product>
|
396
|
-
</ONIXMessage>}
|
397
|
-
|
398
|
-
xml_doc = Nokogiri::XML(xml_string)
|
399
|
-
onix = xml_doc.children.first
|
400
|
-
assert_equal 'a', onix.at_xpath('xmlns:Product').at_xpath('xmlns:RecordReference').text
|
401
|
-
end
|
402
|
-
|
403
|
-
def test_xpath_after_attribute_change
|
404
|
-
xml_string = %q{<?xml version="1.0" encoding="UTF-8"?>
|
405
|
-
<mods version="3.0" xsi:schemaLocation="http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-0.xsd" xmlns="http://www.loc.gov/mods/v3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
406
|
-
<titleInfo>
|
407
|
-
<nonSort>THE</nonSort>
|
408
|
-
<title xml:lang="eng">ARTICLE TITLE HYDRANGEA ARTICLE 1</title>
|
409
|
-
<subTitle>SUBTITLE</subTitle>
|
410
|
-
</titleInfo>
|
411
|
-
<titleInfo lang="finnish">
|
412
|
-
<title>Artikkelin otsikko Hydrangea artiklan 1</title>
|
413
|
-
</titleInfo>
|
414
|
-
</mods>}
|
415
|
-
|
416
|
-
xml_doc = Nokogiri::XML(xml_string)
|
417
|
-
ns_hash = {'mods'=>'http://www.loc.gov/mods/v3'}
|
418
|
-
node = xml_doc.at_xpath('//mods:titleInfo[1]',ns_hash)
|
419
|
-
node['lang'] = 'english'
|
420
|
-
assert_equal 1, xml_doc.xpath('//mods:titleInfo[1]/@lang',ns_hash).length
|
421
|
-
assert_equal 'english', xml_doc.xpath('//mods:titleInfo[1]/@lang',ns_hash).first.value
|
422
|
-
end
|
423
|
-
|
424
|
-
def test_xpath_after_element_removal
|
425
|
-
xml_string = %q{<?xml version="1.0" encoding="UTF-8"?>
|
426
|
-
<mods version="3.0" xsi:schemaLocation="http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-0.xsd" xmlns="http://www.loc.gov/mods/v3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
427
|
-
<titleInfo>
|
428
|
-
<nonSort>THE</nonSort>
|
429
|
-
<title xml:lang="eng">ARTICLE TITLE HYDRANGEA ARTICLE 1</title>
|
430
|
-
<subTitle>SUBTITLE</subTitle>
|
431
|
-
</titleInfo>
|
432
|
-
<titleInfo lang="finnish">
|
433
|
-
<title>Artikkelin otsikko Hydrangea artiklan 1</title>
|
434
|
-
</titleInfo>
|
435
|
-
</mods>}
|
436
|
-
|
437
|
-
xml_doc = Nokogiri::XML(xml_string)
|
438
|
-
ns_hash = {'mods'=>'http://www.loc.gov/mods/v3'}
|
439
|
-
node = xml_doc.at_xpath('//mods:titleInfo[1]',ns_hash)
|
440
|
-
node.remove
|
441
|
-
assert_equal 1, xml_doc.xpath('//mods:titleInfo',ns_hash).length
|
442
|
-
assert_equal 'finnish', xml_doc.xpath('//mods:titleInfo[1]/@lang',ns_hash).first.value
|
443
|
-
end
|
444
|
-
|
445
|
-
def test_xpath_after_reset_doc_via_innerhtml
|
446
|
-
xml = <<XML
|
447
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
448
|
-
<document xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0">
|
449
|
-
<text:section name="Section1">[TEXT_INSIDE_SECTION]</text:section>
|
450
|
-
</document>
|
451
|
-
XML
|
452
|
-
|
453
|
-
doc = Nokogiri::XML(xml)
|
454
|
-
doc.inner_html = doc.inner_html
|
455
|
-
sections = doc.xpath(".//text:section[@name='Section1']")
|
456
|
-
assert_equal 1, sections.size
|
457
|
-
assert_equal "[TEXT_INSIDE_SECTION]", sections.first.text
|
458
|
-
end
|
459
|
-
|
460
|
-
def test_xpath_syntax_error
|
461
|
-
doc = Nokogiri::XML('<ns1:Root></ns1:Root>')
|
462
|
-
begin
|
463
|
-
doc.xpath('//ns1:Root')
|
464
|
-
rescue => e
|
465
|
-
assert_equal false, e.message.include?('0:0')
|
466
|
-
end
|
467
|
-
end
|
468
|
-
end
|
469
|
-
end
|
470
|
-
end
|
@@ -1,133 +0,0 @@
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
2
|
-
|
3
|
-
require "helper"
|
4
|
-
|
5
|
-
module Nokogiri
|
6
|
-
module XSLT
|
7
|
-
class TestCustomFunctions < Nokogiri::TestCase
|
8
|
-
def setup
|
9
|
-
super
|
10
|
-
@xml = Nokogiri.XML(<<-EOXML)
|
11
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
12
|
-
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN"
|
13
|
-
"http://www.w3.org/TR/MathML2/dtd/xhtml-math11-f.dtd">
|
14
|
-
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
|
15
|
-
<head>
|
16
|
-
<meta http-equiv="Content-type" content="application/xhtml+xml"/>
|
17
|
-
<title>Foo</title>
|
18
|
-
</head>
|
19
|
-
<body>
|
20
|
-
<h1>Foo</h1>
|
21
|
-
<p>Lorem ipsum.</p>
|
22
|
-
</body>
|
23
|
-
</html>
|
24
|
-
EOXML
|
25
|
-
end
|
26
|
-
|
27
|
-
def test_function
|
28
|
-
skip("Pure Java version doesn't support this feature.") if !Nokogiri.uses_libxml?
|
29
|
-
foo = Class.new do
|
30
|
-
def capitalize nodes
|
31
|
-
nodes.first.content.upcase
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
XSLT.register "http://e.org/functions", foo
|
36
|
-
|
37
|
-
xsl = Nokogiri.XSLT(<<-EOXSL)
|
38
|
-
<?xml version="1.0"?>
|
39
|
-
<xsl:stylesheet version="1.0"
|
40
|
-
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
41
|
-
xmlns:f="http://e.org/functions"
|
42
|
-
extension-element-prefixes="f">
|
43
|
-
|
44
|
-
<xsl:template match="text()">
|
45
|
-
<xsl:copy-of select="f:capitalize(.)"/>
|
46
|
-
</xsl:template>
|
47
|
-
|
48
|
-
<xsl:template match="@*|node()">
|
49
|
-
<xsl:copy>
|
50
|
-
<xsl:apply-templates select="@*|node()"/>
|
51
|
-
<xsl:apply-imports/>
|
52
|
-
</xsl:copy>
|
53
|
-
</xsl:template>
|
54
|
-
|
55
|
-
</xsl:stylesheet>
|
56
|
-
EOXSL
|
57
|
-
result = xsl.transform @xml
|
58
|
-
assert_match(/FOO/, result.css('title').first.text)
|
59
|
-
end
|
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
|
-
# Minitest 5 uses `self.assertions` in `assert()` which is not
|
67
|
-
# defined in the Minitest::Assertions module :-(
|
68
|
-
attr_writer :assertions
|
69
|
-
def assertions; @assertions ||= 0; end
|
70
|
-
|
71
|
-
def multiarg *args
|
72
|
-
assert_equal ["abc", "xyz"], args
|
73
|
-
args.first
|
74
|
-
end
|
75
|
-
|
76
|
-
def numericarg arg
|
77
|
-
assert_equal 42, arg
|
78
|
-
arg
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
xsl = Nokogiri.XSLT(<<-EOXSL, "http://e.org/functions" => foo)
|
83
|
-
<?xml version="1.0"?>
|
84
|
-
<xsl:stylesheet version="1.0"
|
85
|
-
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
86
|
-
xmlns:f="http://e.org/functions"
|
87
|
-
extension-element-prefixes="f">
|
88
|
-
|
89
|
-
<xsl:template match="text()">
|
90
|
-
<xsl:copy-of select="f:multiarg('abc', 'xyz')"/>
|
91
|
-
<xsl:copy-of select="f:numericarg(42)"/>
|
92
|
-
</xsl:template>
|
93
|
-
</xsl:stylesheet>
|
94
|
-
EOXSL
|
95
|
-
|
96
|
-
xsl.transform @xml
|
97
|
-
end
|
98
|
-
|
99
|
-
|
100
|
-
def test_function_XSLT
|
101
|
-
skip("Pure Java version doesn't support this feature.") if !Nokogiri.uses_libxml?
|
102
|
-
foo = Class.new do
|
103
|
-
def america nodes
|
104
|
-
nodes.first.content.upcase
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
xsl = Nokogiri.XSLT(<<-EOXSL, "http://e.org/functions" => foo)
|
109
|
-
<?xml version="1.0"?>
|
110
|
-
<xsl:stylesheet version="1.0"
|
111
|
-
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
112
|
-
xmlns:f="http://e.org/functions"
|
113
|
-
extension-element-prefixes="f">
|
114
|
-
|
115
|
-
<xsl:template match="text()">
|
116
|
-
<xsl:copy-of select="f:america(.)"/>
|
117
|
-
</xsl:template>
|
118
|
-
|
119
|
-
<xsl:template match="@*|node()">
|
120
|
-
<xsl:copy>
|
121
|
-
<xsl:apply-templates select="@*|node()"/>
|
122
|
-
<xsl:apply-imports/>
|
123
|
-
</xsl:copy>
|
124
|
-
</xsl:template>
|
125
|
-
|
126
|
-
</xsl:stylesheet>
|
127
|
-
EOXSL
|
128
|
-
result = xsl.transform @xml
|
129
|
-
assert_match(/FOO/, result.css('title').first.text)
|
130
|
-
end
|
131
|
-
end
|
132
|
-
end
|
133
|
-
end
|
@@ -1,37 +0,0 @@
|
|
1
|
-
require "helper"
|
2
|
-
|
3
|
-
module Nokogiri
|
4
|
-
module XSLT
|
5
|
-
class TestExceptionHandling < Nokogiri::TestCase
|
6
|
-
def test_java_exception_handling
|
7
|
-
skip('This test is for Java only') if Nokogiri.uses_libxml?
|
8
|
-
|
9
|
-
xml = Nokogiri.XML(<<-EOXML)
|
10
|
-
<foo>
|
11
|
-
<bar/>
|
12
|
-
</foo>
|
13
|
-
EOXML
|
14
|
-
|
15
|
-
xsl = Nokogiri.XSLT(<<-EOXSL)
|
16
|
-
<?xml version="1.0"?>
|
17
|
-
<xsl:stylesheet version="1.0"
|
18
|
-
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
|
19
|
-
|
20
|
-
<xsl:template match="/">
|
21
|
-
<a/>
|
22
|
-
<b/>
|
23
|
-
</xsl:template>
|
24
|
-
</xsl:stylesheet>
|
25
|
-
EOXSL
|
26
|
-
|
27
|
-
begin
|
28
|
-
xsl.transform xml
|
29
|
-
fail('It should not get here')
|
30
|
-
rescue RuntimeError => e
|
31
|
-
assert_match(/Can't have more than one root/, e.to_s, 'The exception message does not contain the expected information')
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|