Module: Nokogiri::XSLT
- Defined in:
- lib/nokogiri/xslt.rb,
lib/nokogiri/xslt/stylesheet.rb,
ext/nokogiri/nokogiri.c
Overview
See Nokogiri::XSLT::Stylesheet for creating and manipulating Stylesheet objects.
🛡 Do not use this module for untrusted stylesheet documents. libxslt does not support
safely processing untrusted stylesheets. Untrusted stylesheets may access the file system and
network, consume large amounts of CPU, memory, or other system resources, and IO and file
access are not restricted. Additionally, the stylesheet is parsed by libxml2 with NOENT and
DTDLOAD enabled (see ParseOptions::DEFAULT_XSLT), meaning that external entities will be
resolved and external subsets will be loaded during parsing.
Defined Under Namespace
Classes: Stylesheet
Class Method Summary collapse
-
.parse(string, modules = {}) ⇒ Object
:call-seq: parse(xsl) → Nokogiri::XSLT::Stylesheet parse(xsl, modules) → Nokogiri::XSLT::Stylesheet.
-
.quote_params(params) ⇒ Object
:call-seq: quote_params(params) → Array.
-
.register(uri, obj) ⇒ Object
docstring is in lib/nokogiri/xslt.rb.
Instance Method Summary collapse
-
#register(uri, custom_handler_class) ⇒ Object
call-seq: register(uri, custom_handler_class).
Class Method Details
.parse(string, modules = {}) ⇒ Object
:call-seq:
parse(xsl) → Nokogiri::XSLT::Stylesheet
parse(xsl, modules) → Nokogiri::XSLT::Stylesheet
Parse the stylesheet in xsl, registering optional modules as custom class handlers.
🛡 Do not pass untrusted stylesheet content to this method. See Nokogiri::XSLT for more information.
[Parameters]
xsl(String) XSL content to be parsed into a stylesheetmodules(Hash<String ⇒ Class>) A hash of URI-to-handler relations for linking a namespace to a custom function handler.
⚠ The XSLT handler classes are registered globally.
Also see Nokogiri::XSLT.register
Example
xml = Nokogiri.XML(<<~XML)
<nodes>
<node>Foo</node>
<node>Bar</node>
</nodes>
XML
handler = Class.new do
def reverse(node)
node.text.reverse
end
end
xsl = <<~XSL
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:myfuncs="http://nokogiri.org/xslt/myfuncs"
extension-element-prefixes="myfuncs">
<xsl:template match="/">
<reversed>
<xsl:for-each select="nodes/node">
<reverse><xsl:copy-of select="myfuncs:reverse(.)"/></reverse>
</xsl:for-each>
</reversed>
</xsl:template>
</xsl:stylesheet>
XSL
xsl = Nokogiri.XSLT(xsl, "http://nokogiri.org/xslt/myfuncs" => handler)
xsl.transform(xml).to_xml
# => "<?xml version=\"1.0\"?>\n" +
# "<reversed>\n" +
# " <reverse>ooF</reverse>\n" +
# " <reverse>raB</reverse>\n" +
# "</reversed>\n"
79 80 81 82 83 84 85 86 87 88 89 90 |
# File 'lib/nokogiri/xslt.rb', line 79 def parse(string, modules = {}) modules.each do |url, klass| XSLT.register(url, klass) end doc = XML::Document.parse(string, nil, nil, XML::ParseOptions::DEFAULT_XSLT) if Nokogiri.jruby? Stylesheet.parse_stylesheet_doc(doc, string) else Stylesheet.parse_stylesheet_doc(doc) end end |
.quote_params(params) ⇒ Object
:call-seq:
quote_params(params) → Array
Quote parameters in params for stylesheet safety.
See Nokogiri::XSLT::Stylesheet.transform for example usage.
[Parameters]
params(Hash, Array) XSLT parameters (key->value, or tuples of [key, value])
[Returns] Array of string parameters, with quotes correctly escaped for use with XSLT::Stylesheet.transform
103 104 105 106 107 108 109 110 111 112 113 114 |
# File 'lib/nokogiri/xslt.rb', line 103 def quote_params(params) params.flatten.each_slice(2).with_object([]) do |kv, quoted_params| key, value = kv.map(&:to_s) value = if value.include?("'") "concat('#{value.gsub("'", %q{', "'", '})}')" else "'#{value}'" end quoted_params << key quoted_params << value end end |
.register(uri, obj) ⇒ Object
docstring is in lib/nokogiri/xslt.rb
427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 |
# File 'ext/nokogiri/xslt_stylesheet.c', line 427
static VALUE
rb_xslt_s_register(VALUE self, VALUE uri, VALUE obj)
{
VALUE modules = rb_iv_get(self, "@modules");
if (NIL_P(modules)) {
rb_raise(rb_eRuntimeError, "internal error: @modules not set");
}
rb_hash_aset(modules, uri, obj);
xsltRegisterExtModule(
(unsigned char *)StringValueCStr(uri),
initFunc,
shutdownFunc
);
return self;
}
|
Instance Method Details
#register(uri, custom_handler_class) ⇒ Object
call-seq:
register(uri, custom_handler_class)
Register a class that implements custom XSLT transformation functions.
⚠ The XSLT handler classes are registered globally.
[Parameters}
uri(String) The namespace for the custom handlerscustom_handler_class(Class) A class with ruby methods that can be called during transformation
See Nokogiri::XSLT.parse for usage.
130 131 132 133 |
# File 'lib/nokogiri/xslt.rb', line 130 def register(uri, custom_handler_class) # NOTE: this is implemented in the C extension, see ext/nokogiri/xslt_stylesheet.c raise NotImplementedError, "Nokogiri::XSLT.register is not implemented on JRuby" end |