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 object.
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.
- 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 70
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 94
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;
}