Module: Nokogiri::XSLT
| Relationships & Source Files | |
| Namespace Children | |
|
Classes:
| |
| Defined in: | lib/nokogiri/xslt.rb, ext/nokogiri/nokogiri.c, ext/nokogiri/xslt_stylesheet.c, lib/nokogiri/xslt/stylesheet.rb |
Overview
See 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.
Class Method Summary
-
.parse(xsl) → Nokogiri::XSLT::Stylesheet)
Parse the stylesheet in
xsl, registering optionalmodulesas custom class handlers. -
.quote_params(params) → Array)
Quote parameters in
paramsfor stylesheet safety. -
.register(uri, custom_handler_class)
Register a class that implements custom
XSLTtransformation functions.
Class Method Details
.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 XSLT for more information.
- Parameters
-
xsl(String) XSL content to be parsed into a stylesheet -
modules(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 .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"
# 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) → Array)
Quote parameters in params for stylesheet safety. See Nokogiri::XSLT::Stylesheet.transform for example usage.
- Parameters
-
params(Hash, Array)XSLTparameters (key->value, or tuples of [key, value])
- Returns
-
Array of string parameters, with quotes correctly escaped for use with Stylesheet#transform
# 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, 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 handlers -
custom_handler_class(Class) A class with ruby methods that can be called during transformation
See .parse for usage.
# File 'ext/nokogiri/xslt_stylesheet.c', line 391
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;
}