/**
* xslTransform
* Tools for XSLT transformations; jQuery wrapper for Sarissa .
* 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 , Matt Antone
* @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 = 'bar';
* 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 ]);
}
});
};