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

Instance Method Summary collapse

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 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 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 handlers
  • custom_handler_class (Class) A class with ruby methods that can be called during transformation

See Nokogiri::XSLT.parse for usage.

Raises:

  • (NotImplementedError)


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