Class: Nokogiri::XSLT::Stylesheet
- Inherits:
-
Object
- Object
- Nokogiri::XSLT::Stylesheet
- Defined in:
- lib/nokogiri/xslt/stylesheet.rb,
ext/nokogiri/xslt_stylesheet.c
Overview
A Stylesheet represents an XSLT Stylesheet object. Stylesheet creation is done through Nokogiri.XSLT. Here is an example of transforming an XML::Document with a Stylesheet:
doc = Nokogiri::XML(File.read('some_file.xml'))
xslt = Nokogiri::XSLT(File.read('some_transformer.xslt'))
puts xslt.transform(doc)
See Nokogiri::XSLT::Stylesheet#transform for more transformation information.
Class Method Summary collapse
-
.parse_stylesheet_doc(document) ⇒ Object
Parse a stylesheet from
document
.
Instance Method Summary collapse
-
#apply_to(document, params = []) ⇒ Object
Apply an XSLT stylesheet to an XML::Document.
-
#serialize(document) ⇒ Object
Serialize
document
to an xml string. -
#transform(document, params = []) ⇒ Object
Apply an XSLT stylesheet to an XML::Document.
Class Method Details
.parse_stylesheet_doc(document) ⇒ Object
Parse a stylesheet from document
.
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
# File 'ext/nokogiri/xslt_stylesheet.c', line 42
static VALUE parse_stylesheet_doc(VALUE klass, VALUE xmldocobj)
{
xmlDocPtr xml ;
xsltStylesheetPtr ss ;
Data_Get_Struct(xmldocobj, xmlDoc, xml);
exsltRegisterAll();
xsltSetGenericErrorFunc(NULL, xslt_generic_error_handler);
ss = xsltParseStylesheetDoc(xmlCopyDoc(xml, 1)); /* 1 => recursive */
xsltSetGenericErrorFunc(NULL, NULL);
return Data_Wrap_Struct(klass, NULL, dealloc, ss);
}
|
Instance Method Details
#apply_to(document, params = []) ⇒ Object
Apply an XSLT stylesheet to an XML::Document. params
is an array of strings used as XSLT parameters. returns serialized document
20 21 22 |
# File 'lib/nokogiri/xslt/stylesheet.rb', line 20 def apply_to document, params = [] serialize(transform(document, params)) end |
#serialize(document) ⇒ Object
Serialize document
to an xml string.
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
# File 'ext/nokogiri/xslt_stylesheet.c', line 65
static VALUE serialize(VALUE self, VALUE xmlobj)
{
xmlDocPtr xml ;
xsltStylesheetPtr ss ;
xmlChar* doc_ptr ;
int doc_len ;
VALUE rval ;
Data_Get_Struct(xmlobj, xmlDoc, xml);
Data_Get_Struct(self, xsltStylesheet, ss);
xsltSaveResultToString(&doc_ptr, &doc_len, xml, ss);
rval = NOKOGIRI_STR_NEW(doc_ptr, doc_len);
xmlFree(doc_ptr);
return rval ;
}
|
#transform(document, params = []) ⇒ Object
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
# File 'ext/nokogiri/xslt_stylesheet.c', line 96
static VALUE transform(int argc, VALUE* argv, VALUE self)
{
VALUE xmldoc, paramobj ;
xmlDocPtr xml ;
xmlDocPtr result ;
xsltStylesheetPtr ss ;
const char** params ;
long param_len, j ;
rb_scan_args(argc, argv, "11", &xmldoc, ¶mobj);
if (NIL_P(paramobj)) { paramobj = rb_ary_new2(0L) ; }
if (!rb_obj_is_kind_of(xmldoc, cNokogiriXmlDocument))
rb_raise(rb_eArgError, "argument must be a Nokogiri::XML::Document");
/* handle hashes as arguments. */
if(T_HASH == TYPE(paramobj)) {
paramobj = rb_funcall(paramobj, rb_intern("to_a"), 0);
paramobj = rb_funcall(paramobj, rb_intern("flatten"), 0);
}
Check_Type(paramobj, T_ARRAY);
Data_Get_Struct(xmldoc, xmlDoc, xml);
Data_Get_Struct(self, xsltStylesheet, ss);
param_len = RARRAY_LEN(paramobj);
params = calloc((size_t)param_len+1, sizeof(char*));
for (j = 0 ; j < param_len ; j++) {
VALUE entry = rb_ary_entry(paramobj, j);
const char * ptr = StringValuePtr(entry);
params[j] = ptr;
}
params[param_len] = 0 ;
result = xsltApplyStylesheet(ss, xml, params);
free(params);
if (!result) rb_raise(rb_eRuntimeError, "could not perform xslt transform on document");
return Nokogiri_wrap_xml_document((VALUE)0, result) ;
}
|