| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 | /** * xslTransform * Tools for XSLT transformations; jQuery wrapper for Sarissa <http://sarissa.sourceforge.net/>. * See jQuery.fn.log below for documentation on $.log(). * See jQuery.fn.getTransform below for documention on the $.getTransform(). * See var DEBUG below for turning debugging/logging on and off. * * @version   20071203 * @since     2006-07-05 * @copyright Copyright (c) 2006 Glyphix Studio, Inc. http://www.glyphix.com * @author    Brad Brizendine <brizbane@gmail.com>, Matt Antone <antone@glyphix.com> * @license   MIT http://www.opensource.org/licenses/mit-license.php * @requires  >= jQuery 1.0.3			http://jquery.com/ * @requires  jquery.debug.js			http://jquery.glyphix.com/ * @requires  >= sarissa.js 0.9.7.6		http://sarissa.sourceforge.net/ * * @example * var r = xslTransform.transform('path-to-xsl.xsl','path-to-xml.xml'); * @desc Perform a transformation and place the results in var r * * @example * var r = xslTransform.transform('path-to-xsl.xsl','path-to-xml.xml'); * var str = xslTransform.serialize( r ); * @desc Perform a transformation, then turn the result into a string * * @example * var doc = xslTransform.load('path-to-xml.xml'); * @desc Load an xml file and return a parsed xml object * * @example * var xml = '<xmldoc><foo>bar</foo></xmldoc>'; * var doc = xslTransform.load(xml); * @desc Load an xml string and return a parsed xml object */var xslTransform = {	init: function() { },	XMLSerializer: new XMLSerializer(),	serialize: function(data) {		if(typeof(data) == 'string') return data;		return this.XMLSerializer.serializeToString(data);	},	load: function(xml, meth, dat) {		var r;		if(typeof(xml) == 'object') { return xml; }		if(xml.substring(0,1) == '<') { r = this.loadString( xml ); }		else { r = this.loadFile(xml, meth, dat); }		if(r) {			r.setProperty('SelectionNamespaces', 'xmlns:xsl="http://www.w3.org/1999/XSL/Transform"');			r.setProperty('SelectionLanguage', 'XPath');			return r;		}		else return false;	},	loadString: function(str) {		var p = new DOMParser();		var xml = p.parseFromString(str, 'text/xml');		if(!xml) return false;		return xml;	},	loadFile: function(url, meth, dat){		if(!url) return false;		var doc;		this.xhrsuccess = function(data,str) {			doc = data;			return true;		};		this.xhrerror = function(xhr,err){			doc = null;			return false;		};		if(!meth)	meth = "GET";		if(!dat)	dat = {};		jQuery.ajax({			type:		meth,			url:		url,			data:		dat,			async:		false,			success:	this.xhrsuccess,			error:		this.xhrerror		});		if(!doc) return false;		if(doc.length == 0) return false;		return doc;	},	transform: function(xsl, xml, options) {		var log = { 'xsl':xsl, 'xml':xml, 'options':options };		options = options || {};		var xml = { 'request':xml, 'doc':this.load(xml, options.meth, options.dat) };		if(xml.doc == false) return false;		var result = { 'xsl':this.load(xsl, options.meth, options.dat) };		if(result.xsl == false) return false;		result.json = false;		if(options.json && xml.doc) {			result.json = xml.doc.selectSingleNode(options.json.toString());		}		var processor = new XSLTProcessor();		processor.importStylesheet( result.xsl );		if(options.params && processor) {			for(key in options.params) {				processor.setParameter(null, key.toString(), options.params[key].toString());			}		}		result.doc = processor.transformToDocument( xml.doc );		var errorTxt = Sarissa.getParseErrorText(result.doc);		if(errorTxt != Sarissa.PARSED_OK) return false;		result.string = this.serialize( result.doc );		result.scripts = jQuery('script',result.doc).text();		return result;	}};xslTransform.init();jQuery.fn.getTransform = function(xsl, xml, options){	var settings = {		append:		false,		params:		{},		xpath:		'',		eval:		true,		callback:	'',		error:		'',		json:		false,		meth:		"GET",		dat:		{ }	};	jQuery.extend(settings, options);	if(!xsl || !xml) { return; }	var trans = xslTransform.transform(xsl, xml, settings);	if(trans == false) {		if(settings.error && jQuery.isFunction(settings.error)) {			settings.error.apply(window, [ ]);		}		return;	}	return this.each( function(){		var re = trans.string.match(/<\?xml.*?\?>/);		if(re) { trans.string = trans.string.replace(re, ''); }		try {			if(settings.append)			jQuery(this).append(trans.string);			else if(settings.repl)		jQuery(this).replaceWith(trans.string);			else						jQuery(this).html(trans.string);		} catch(e) {			jQuery(this)[0].innerHTML = trans.string;		}		if(settings.eval && trans.scripts) {			if(trans.scripts.length > 0) {				eval.call(window, trans.scripts);			}		}		if(settings.callback && jQuery.isFunction(settings.callback)) {			var json = false;			if(settings.json && trans.json) eval("json = " + trans.json.firstChild.data);			settings.callback.apply(window, [trans.string, json ]);		}	});};
 |