Class: XML::XSLT
- Inherits:
-
Object
- Object
- XML::XSLT
- Defined in:
- lib/xml/xslt.rb,
ext/xslt_lib/xslt_lib.c
Defined Under Namespace
Classes: ParsingError, TransformationError, XSLTError
Constant Summary collapse
- MAX_DEPTH =
INT2NUM(xsltMaxDepth)
- MAX_SORT =
INT2NUM(XSLT_MAX_SORT)
- ENGINE_VERSION =
rb_str_new2(xsltEngineVersion)
- LIBXSLT_VERSION =
INT2NUM(xsltLibxsltVersion)
- LIBXML_VERSION =
INT2NUM(xsltLibxmlVersion)
- XSLT_NAMESPACE =
rb_str_new2((char *)XSLT_NAMESPACE)
- DEFAULT_VENDOR =
rb_str_new2(XSLT_DEFAULT_VENDOR)
- DEFAULT_VERSION =
rb_str_new2(XSLT_DEFAULT_VERSION)
- DEFAULT_URL =
rb_str_new2(XSLT_DEFAULT_URL)
- NAMESPACE_LIBXSLT =
rb_str_new2((char *)XSLT_LIBXSLT_NAMESPACE)
- NAMESPACE_SAXON =
rb_str_new2((char *)XSLT_SAXON_NAMESPACE)
- NAMESPACE_XT =
rb_str_new2((char *)XSLT_XT_NAMESPACE)
- NAMESPACE_XALAN =
rb_str_new2((char *)XSLT_XALAN_NAMESPACE)
- RUBY_XSLT_VERSION =
rb_str_new2(RUBY_XSLT_VERSION)
- @@extFunctions =
{}
Class Method Summary collapse
-
.extFunction(name, ns_uri, receiver) ⇒ Object
deprecated, see
registerExtFunc
. -
.new ⇒ Object
oXSLT = XML::XSLT::new().
-
.registerErrorHandler(&block) ⇒ Object
(also: register_error_handler)
registers a block to be called when libxml2 or libxslt encounter an error eg:.
-
.registerExtFunc(namespace, name, &block) ⇒ Object
(also: register_ext_func)
sets up a block for callback when the XPath function namespace:name( … ) is encountered in a stylesheet.
-
.registerFunction(namespace, name) ⇒ Object
internal use only.
Instance Method Summary collapse
-
#mediaType ⇒ Object
(also: #media_type)
mediaTypeString = oXSLT.mediaType( ).
-
#parameters=(parameters) ⇒ Object
oXSLT.parameters={ “key” => “value”, “key” => “value”, … }.
-
#save(xOutFilename) ⇒ Object
oXSLT.save( “result.xml” ).
-
#serve ⇒ Object
output_string = oXSLT.serve( ).
-
#xml ⇒ Object
string = oXSLT.xml.
-
#xml=(xml_doc_obj) ⇒ Object
oXSLT.xml=<data|REXML::Document|XML::Smart|file>.
-
#xmlfile=(xml_doc_obj) ⇒ Object
XML::XSLT#xmlfile=<file> is deprecated.
-
#xmlobject ⇒ Object
object = oXSLT.xmlobject.
-
#xsl ⇒ Object
string = oXSLT.xsl.
-
#xsl=(xsl_doc_obj) ⇒ Object
oXSLT.xsl=<data|REXML::Document|XML::Smart|file>.
-
#xsl_to_s ⇒ Object
string = oXSLT.xsl_to_s( ).
-
#xslfile=(xsl_doc_obj) ⇒ Object
XML::XSLT#xslfile=<file> is deprecated.
-
#xslobject ⇒ Object
object = oXSLT.xslobject.
Class Method Details
.extFunction(name, ns_uri, receiver) ⇒ Object
deprecated, see registerExtFunc
54 55 56 57 58 |
# File 'lib/xml/xslt.rb', line 54 def self.extFunction(name, ns_uri, receiver) #:nodoc: self.registerExtFunc(ns_uri, name) do |*args| receiver.send(name.gsub(/-/, "_"), *args) end end |
.new ⇒ Object
oXSLT = XML::XSLT::new()
Create a new XML::XSLT object
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
# File 'ext/xslt_lib/xslt_lib.c', line 63 VALUE ruby_xslt_new( VALUE class ) { RbTxslt *pRbTxslt; pRbTxslt = (RbTxslt *)malloc(sizeof(RbTxslt)); if( pRbTxslt == NULL ) rb_raise(rb_eNoMemError, "No memory left for XSLT struct"); pRbTxslt->iXmlType = RUBY_XSLT_XMLSRC_TYPE_NULL; pRbTxslt->xXmlData = Qnil; pRbTxslt->oXmlObject = Qnil; pRbTxslt->xXmlString = Qnil; pRbTxslt->tXMLDocument = NULL; pRbTxslt->iXslType = RUBY_XSLT_XSLSRC_TYPE_NULL; pRbTxslt->xXslData = Qnil; pRbTxslt->oXslObject = Qnil; pRbTxslt->xXslString = Qnil; pRbTxslt->tParsedXslt = NULL; pRbTxslt->iXmlResultType = RUBY_XSLT_XMLSRC_TYPE_NULL; pRbTxslt->xXmlResultCache = Qnil; pRbTxslt->pxParams = Qnil; pRbTxslt->iNbParams = 0; xmlInitMemory(); xmlSubstituteEntitiesDefault( 1 ); xmlLoadExtDtdDefaultValue = 1; return( Data_Wrap_Struct( class, ruby_xslt_mark, ruby_xslt_free, pRbTxslt ) ); } |
.registerErrorHandler(&block) ⇒ Object Also known as: register_error_handler
registers a block to be called when libxml2 or libxslt encounter an error eg:
XML::XSLT.registerErrorHandler do |error_str|
$stderr.puts error_str
end
67 68 69 |
# File 'lib/xml/xslt.rb', line 67 def self.registerErrorHandler(&block) @@error_handler = block end |
.registerExtFunc(namespace, name, &block) ⇒ Object Also known as: register_ext_func
sets up a block for callback when the XPath function namespace:name( … ) is encountered in a stylesheet.
XML::XSLT.registerExtFunc(namespace_uri, name) do |*args|
puts args.inspect
end
XPath arguments are converted to Ruby objects accordingly:
- number (eg.
1
) -
Float
- boolean (eg.
false()
) -
TrueClass/FalseClass
- nodeset (eg.
/entry/*
) -
Array of REXML::Elements
- variable (eg.
$var
) -
UNIMPLEMENTED
It works the same in the other direction, eg. if the block returns an array of REXML::Elements the value of the function will be a nodeset.
Note: currently, passing a nodeset to Ruby or REXML::Elements to libxslt serializes the nodes and then parses them. Doing this with large sets is a bad idea. In the future they’ll be passed back and forth using Ruby’s libxml2 bindings.
47 48 49 50 51 |
# File 'lib/xml/xslt.rb', line 47 def self.registerExtFunc(namespace, name, &block) @@extFunctions[namespace] ||= {} @@extFunctions[namespace][name] = block XML::XSLT.registerFunction(namespace, name) end |
.registerFunction(namespace, name) ⇒ Object
internal use only.
483 484 485 486 487 |
# File 'ext/xslt_lib/xslt_lib.c', line 483 VALUE ruby_xslt_reg_function( VALUE class, VALUE namespace, VALUE name ) { xsltRegisterExtModuleFunction( BAD_CAST StringValuePtr(name), BAD_CAST StringValuePtr(namespace), xmlXPathFuncCallback ); return Qnil; } |
Instance Method Details
#mediaType ⇒ Object Also known as: media_type
mediaTypeString = oXSLT.mediaType( )
Return the XSL output’s media type
461 462 463 464 465 466 467 468 469 470 471 472 473 474 |
# File 'ext/xslt_lib/xslt_lib.c', line 461 VALUE ruby_xslt_media_type( VALUE self ) { RbTxslt *pRbTxslt; xsltStylesheetPtr vXSLTSheet = NULL; Data_Get_Struct( self, RbTxslt, pRbTxslt ); vXSLTSheet = pRbTxslt->tParsedXslt; if ( (vXSLTSheet == NULL) || (vXSLTSheet->mediaType == NULL) ) { return Qnil; } else { return rb_str_new2( (char *)(vXSLTSheet->mediaType) ); } } |
#parameters=(parameters) ⇒ Object
oXSLT.parameters={ “key” => “value”, “key” => “value”, … }
428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 |
# File 'ext/xslt_lib/xslt_lib.c', line 428 VALUE ruby_xslt_parameters_set( VALUE self, VALUE parameters ) { RbTxslt *pRbTxslt; Check_Type( parameters, T_HASH ); Data_Get_Struct( self, RbTxslt, pRbTxslt ); if( !NIL_P(parameters) ){ pRbTxslt->pxParams = rb_ary_new( ); // each_pair and process_pair defined ind parameters.c (void)rb_iterate( each_pair, parameters, process_pair, pRbTxslt->pxParams ); pRbTxslt->iNbParams = FIX2INT( rb_funcall( parameters, rb_intern("size"), 0, 0 ) ) * 2 + 2; pRbTxslt->iXmlResultType = RUBY_XSLT_XMLSRC_TYPE_NULL; } return( Qnil ); } |
#save(xOutFilename) ⇒ Object
oXSLT.save( “result.xml” )
Save the stylesheet transformation to file
338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 |
# File 'ext/xslt_lib/xslt_lib.c', line 338 VALUE ruby_xslt_save( VALUE self, VALUE xOutFilename ) { char *xOut; VALUE rOut; FILE *fOutFile; rOut = ruby_xslt_serve( self ); if( rOut != Qnil ) { xOut = StringValuePtr( rOut ); fOutFile = fopen( StringValuePtr( xOutFilename ), "w" ); if( fOutFile == NULL ) { free( xOut ); rb_raise( rb_eRuntimeError, "Can't create file %s\n", StringValuePtr( xOutFilename ) ); rOut = Qnil; } else { fwrite( xOut, 1, strlen( xOut ), fOutFile ); fclose( fOutFile ); } } return( rOut ); } |
#serve ⇒ Object
output_string = oXSLT.serve( )
Return the stylesheet transformation
292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 |
# File 'ext/xslt_lib/xslt_lib.c', line 292 VALUE ruby_xslt_serve( VALUE self ) { RbTxslt *pRbTxslt; char *xOut; char **pxParams = NULL; Data_Get_Struct( self, RbTxslt, pRbTxslt ); if( pRbTxslt->iXmlResultType == RUBY_XSLT_XMLSRC_TYPE_NULL ) { if( pRbTxslt->pxParams != Qnil ){ int iCpt; pxParams = (char **)ALLOCA_N( void *, pRbTxslt->iNbParams ); MEMZERO( pxParams, void *, pRbTxslt->iNbParams ); for( iCpt = 0; iCpt <= pRbTxslt->iNbParams - 3; iCpt++ ) { VALUE tmp = rb_ary_entry( pRbTxslt->pxParams, iCpt ); pxParams[iCpt] = StringValuePtr( tmp ); } } if( pRbTxslt->iXslType != RUBY_XSLT_XSLSRC_TYPE_NULL && pRbTxslt->iXmlType != RUBY_XSLT_XMLSRC_TYPE_NULL ) { xOut = parse( pRbTxslt->tParsedXslt, pRbTxslt->tXMLDocument, pxParams ); if( xOut == NULL ) { pRbTxslt->xXmlResultCache = Qnil; pRbTxslt->iXmlResultType = RUBY_XSLT_XMLSRC_TYPE_NULL; } else { pRbTxslt->xXmlResultCache = rb_str_new2( xOut ); pRbTxslt->iXmlResultType = RUBY_XSLT_XMLSRC_TYPE_STR; free( xOut ); } } else { pRbTxslt->xXmlResultCache = Qnil; pRbTxslt->iXmlResultType = RUBY_XSLT_XMLSRC_TYPE_NULL; } } return( pRbTxslt->xXmlResultCache ); } |
#xml ⇒ Object
string = oXSLT.xml
Return XML, set by XML::XSLT#xml=, as string
165 166 167 168 169 170 |
# File 'ext/xslt_lib/xslt_lib.c', line 165 VALUE ruby_xslt_xml_2str_get( VALUE self ) { RbTxslt *pRbTxslt; Data_Get_Struct( self, RbTxslt, pRbTxslt ); return( pRbTxslt->xXmlString ); } |
#xml=(xml_doc_obj) ⇒ Object
oXSLT.xml=<data|REXML::Document|XML::Smart|file>
Set XML data.
Parameter can be type String, REXML::Document, XML::Smart::Dom or Filename
Examples :
# Parameter as String
oXSLT.xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<test>This is a test string</test>\n"
# Parameter as REXML::Document
require 'rexml/document'
oXSLT.xml = REXML::Document.new File.open( "test.xml" )
# Parameter as XML::Smart::Dom
require 'xml/smart'
oXSLT.xml = XML::Smart.open( "test.xml" )
# Parameter as Filename
oXSLT.xml = "test.xml"
124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
# File 'ext/xslt_lib/xslt_lib.c', line 124 VALUE ruby_xslt_xml_obj_set( VALUE self, VALUE xml_doc_obj ) { RbTxslt *pRbTxslt; Data_Get_Struct( self, RbTxslt, pRbTxslt ); pRbTxslt->oXmlObject = xml_doc_obj; pRbTxslt->xXmlString = object_to_string( xml_doc_obj ); if( pRbTxslt->xXmlString == Qnil ) { rb_raise( eXSLTError, "Can't get XML data" ); } pRbTxslt->iXmlType = RUBY_XSLT_XMLSRC_TYPE_STR; pRbTxslt->xXmlData = pRbTxslt->xXmlString; pRbTxslt->iXmlResultType = RUBY_XSLT_XMLSRC_TYPE_NULL; if( pRbTxslt->tXMLDocument != NULL ) { xmlFreeDoc(pRbTxslt->tXMLDocument); } pRbTxslt->tXMLDocument = parse_xml( StringValuePtr( pRbTxslt->xXmlData ), pRbTxslt->iXmlType ); if( pRbTxslt->tXMLDocument == NULL ) { rb_raise( eXSLTParsingError, "XML parsing error" ); } pRbTxslt->iXmlType = RUBY_XSLT_XMLSRC_TYPE_PARSED; return( Qnil ); } |
#xmlfile=(xml_doc_obj) ⇒ Object
XML::XSLT#xmlfile=<file> is deprecated. Please use XML::XSLT#xml=<file>
155 156 157 158 |
# File 'ext/xslt_lib/xslt_lib.c', line 155 VALUE ruby_xslt_xml_obj_set_d( VALUE self, VALUE xml_doc_obj ) { rb_warn( "XML::XSLT#xmlfile=<file> is deprecated. Please use XML::XSLT#xml=<file> !" ); return( ruby_xslt_xml_obj_set( self, xml_doc_obj ) ); } |
#xmlobject ⇒ Object
object = oXSLT.xmlobject
Return the XML object set by XML::XSLT#xml=
177 178 179 180 181 182 |
# File 'ext/xslt_lib/xslt_lib.c', line 177 VALUE ruby_xslt_xml_2obj_get( VALUE self ) { RbTxslt *pRbTxslt; Data_Get_Struct( self, RbTxslt, pRbTxslt ); return( pRbTxslt->oXmlObject ); } |
#xsl ⇒ Object
string = oXSLT.xsl
Return XSL, set by XML::XSLT#xsl=, as string
264 265 266 267 268 269 |
# File 'ext/xslt_lib/xslt_lib.c', line 264 VALUE ruby_xslt_xsl_2str_get( VALUE self ) { RbTxslt *pRbTxslt; Data_Get_Struct( self, RbTxslt, pRbTxslt ); return( pRbTxslt->xXslString ); } |
#xsl=(xsl_doc_obj) ⇒ Object
oXSLT.xsl=<data|REXML::Document|XML::Smart|file>
Set XSL data.
Parameter can be type String, REXML::Document, XML::Smart::Dom or Filename
Examples :
# Parameter as String
oXSLT.xsl = "<?xml version=\"1.0\" ?>\n<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"1.0\">\n <xsl:template match=\"/\">\n <xsl:apply-templates />\n </xsl:template>\n</xsl:stylesheet>\n"
# Parameter as REXML::Document
require 'rexml/document'
oXSLT.xsl = REXML::Document.new File.open( "test.xsl" )
# Parameter as XML::Smart::Dom
require 'xml/smart'
oXSLT.xsl = XML::Smart.open( "test.xsl" )
# Parameter as Filename
oXSLT.xsl = "test.xsl"
217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 |
# File 'ext/xslt_lib/xslt_lib.c', line 217 VALUE ruby_xslt_xsl_obj_set( VALUE self, VALUE xsl_doc_obj ) { RbTxslt *pRbTxslt; Data_Get_Struct( self, RbTxslt, pRbTxslt ); pRbTxslt->oXslObject = xsl_doc_obj; pRbTxslt->xXslString = object_to_string( xsl_doc_obj ); if( pRbTxslt->xXslString == Qnil ) { rb_raise( eXSLTError, "Can't get XSL data" ); } if( objectIsFile( xsl_doc_obj ) ) { pRbTxslt->iXslType = RUBY_XSLT_XSLSRC_TYPE_FILE; pRbTxslt->xXslData = pRbTxslt->oXslObject; } else { pRbTxslt->iXslType = RUBY_XSLT_XSLSRC_TYPE_STR; pRbTxslt->xXslData = pRbTxslt->xXslString; } pRbTxslt->iXmlResultType = RUBY_XSLT_XMLSRC_TYPE_NULL; if( pRbTxslt->tParsedXslt != NULL ) { xsltFreeStylesheet(pRbTxslt->tParsedXslt); } pRbTxslt->tParsedXslt = parse_xsl( StringValuePtr( pRbTxslt->xXslData ), pRbTxslt->iXslType ); if( pRbTxslt->tParsedXslt == NULL ) { rb_raise( eXSLTParsingError, "XSL Stylesheet parsing error" ); } pRbTxslt->iXslType = RUBY_XSLT_XSLSRC_TYPE_PARSED; return( Qnil ); } |
#xsl_to_s ⇒ Object
string = oXSLT.xsl_to_s( )
492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 |
# File 'ext/xslt_lib/xslt_lib.c', line 492 VALUE ruby_xslt_to_s( VALUE self ) { VALUE vStrOut; RbTxslt *pRbTxslt; xsltStylesheetPtr vXSLTSheet = NULL; const char *xKlassName = rb_class2name( CLASS_OF( self ) ); Data_Get_Struct( self, RbTxslt, pRbTxslt ); //vXSLTSheet = xsltParseStylesheetDoc( xmlParseMemory( StringValuePtr( pRbTxslt->xXslData ), strlen( StringValuePtr( pRbTxslt->xXslData ) ) ) ); vXSLTSheet = pRbTxslt->tParsedXslt; if (vXSLTSheet == NULL) return Qnil; vStrOut = rb_str_new( 0, strlen(xKlassName)+1024 ); (void) sprintf( RSTRING_PTR(vStrOut), "#<%s: parent=%p,next=%p,imports=%p,docList=%p," "doc=%p,stripSpaces=%p,stripAll=%d,cdataSection=%p," "variables=%p,templates=%p,templatesHash=%p," "rootMatch=%p,keyMatch=%p,elemMatch=%p," "attrMatch=%p,parentMatch=%p,textMatch=%p," "piMatch=%p,commentMatch=%p,nsAliases=%p," "attributeSets=%p,nsHash=%p,nsDefs=%p,keys=%p," "method=%s,methodURI=%s,version=%s,encoding=%s," "omitXmlDeclaration=%d,decimalFormat=%p,standalone=%d," "doctypePublic=%s,doctypeSystem=%s,indent=%d," "mediaType=%s,preComps=%p,warnings=%d,errors=%d," "exclPrefix=%s,exclPrefixTab=%p,exclPrefixNr=%d," "exclPrefixMax=%d>", xKlassName, vXSLTSheet->parent, vXSLTSheet->next, vXSLTSheet->imports, vXSLTSheet->docList, vXSLTSheet->doc, vXSLTSheet->stripSpaces, vXSLTSheet->stripAll, vXSLTSheet->cdataSection, vXSLTSheet->variables, vXSLTSheet->templates, vXSLTSheet->templatesHash, vXSLTSheet->rootMatch, vXSLTSheet->keyMatch, vXSLTSheet->elemMatch, vXSLTSheet->attrMatch, vXSLTSheet->parentMatch, vXSLTSheet->textMatch, vXSLTSheet->piMatch, vXSLTSheet->commentMatch, vXSLTSheet->nsAliases, vXSLTSheet->attributeSets, vXSLTSheet->nsHash, vXSLTSheet->nsDefs, vXSLTSheet->keys, vXSLTSheet->method, vXSLTSheet->methodURI, vXSLTSheet->version, vXSLTSheet->encoding, vXSLTSheet->omitXmlDeclaration, vXSLTSheet->decimalFormat, vXSLTSheet->standalone, vXSLTSheet->doctypePublic, vXSLTSheet->doctypeSystem, vXSLTSheet->indent, vXSLTSheet->mediaType, vXSLTSheet->preComps, vXSLTSheet->warnings, vXSLTSheet->errors, vXSLTSheet->exclPrefix, vXSLTSheet->exclPrefixTab, vXSLTSheet->exclPrefixNr, vXSLTSheet->exclPrefixMax ); vStrOut = strlen(RSTRING_PTR(vStrOut)); if( OBJ_TAINTED(self) ) OBJ_TAINT(vStrOut); // xsltFreeStylesheet(vXSLTSheet); return( vStrOut ); } |
#xslfile=(xsl_doc_obj) ⇒ Object
XML::XSLT#xslfile=<file> is deprecated. Please use XML::XSLT#xsl=<file>
254 255 256 257 |
# File 'ext/xslt_lib/xslt_lib.c', line 254 VALUE ruby_xslt_xsl_obj_set_d( VALUE self, VALUE xsl_doc_obj ) { rb_warning( "XML::XSLT#xslfile=<file> is deprecated. Please use XML::XSLT#xsl=<file> !" ); return( ruby_xslt_xsl_obj_set( self, xsl_doc_obj ) ); } |
#xslobject ⇒ Object
object = oXSLT.xslobject
Return the XSL object set by XML::XSLT#xsl=
276 277 278 279 280 281 |
# File 'ext/xslt_lib/xslt_lib.c', line 276 VALUE ruby_xslt_xsl_2obj_get( VALUE self ) { RbTxslt *pRbTxslt; Data_Get_Struct( self, RbTxslt, pRbTxslt ); return( pRbTxslt->oXslObject ); } |