123456789_123456789_123456789_123456789_123456789_

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

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"
[ GitHub ]

  
# 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) XSLT parameters (key->value, or tuples of [key, value])

Returns

Array of string parameters, with quotes correctly escaped for use with Stylesheet#transform

[ GitHub ]

  
# 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.

Raises:

  • (NotImplementedError)
[ GitHub ]

  
# 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;
}