jquery.xslt.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. /**
  2. * xslTransform
  3. * Tools for XSLT transformations; jQuery wrapper for Sarissa <http://sarissa.sourceforge.net/>.
  4. * See jQuery.fn.log below for documentation on $.log().
  5. * See jQuery.fn.getTransform below for documention on the $.getTransform().
  6. * See var DEBUG below for turning debugging/logging on and off.
  7. *
  8. * @version 20071203
  9. * @since 2006-07-05
  10. * @copyright Copyright (c) 2006 Glyphix Studio, Inc. http://www.glyphix.com
  11. * @author Brad Brizendine <brizbane@gmail.com>, Matt Antone <antone@glyphix.com>
  12. * @license MIT http://www.opensource.org/licenses/mit-license.php
  13. * @requires >= jQuery 1.0.3 http://jquery.com/
  14. * @requires jquery.debug.js http://jquery.glyphix.com/
  15. * @requires >= sarissa.js 0.9.7.6 http://sarissa.sourceforge.net/
  16. *
  17. * @example
  18. * var r = xslTransform.transform('path-to-xsl.xsl','path-to-xml.xml');
  19. * @desc Perform a transformation and place the results in var r
  20. *
  21. * @example
  22. * var r = xslTransform.transform('path-to-xsl.xsl','path-to-xml.xml');
  23. * var str = xslTransform.serialize( r );
  24. * @desc Perform a transformation, then turn the result into a string
  25. *
  26. * @example
  27. * var doc = xslTransform.load('path-to-xml.xml');
  28. * @desc Load an xml file and return a parsed xml object
  29. *
  30. * @example
  31. * var xml = '<xmldoc><foo>bar</foo></xmldoc>';
  32. * var doc = xslTransform.load(xml);
  33. * @desc Load an xml string and return a parsed xml object
  34. */
  35. var xslTransform = {
  36. init: function() { },
  37. XMLSerializer: new XMLSerializer(),
  38. serialize: function(data) {
  39. if(typeof(data) == 'string') return data;
  40. return this.XMLSerializer.serializeToString(data);
  41. },
  42. load: function(xml, meth, dat) {
  43. var r;
  44. if(typeof(xml) == 'object') { return xml; }
  45. if(xml.substring(0,1) == '<') { r = this.loadString( xml ); }
  46. else { r = this.loadFile(xml, meth, dat); }
  47. if(r) {
  48. r.setProperty('SelectionNamespaces', 'xmlns:xsl="http://www.w3.org/1999/XSL/Transform"');
  49. r.setProperty('SelectionLanguage', 'XPath');
  50. return r;
  51. }
  52. else return false;
  53. },
  54. loadString: function(str) {
  55. var p = new DOMParser();
  56. var xml = p.parseFromString(str, 'text/xml');
  57. if(!xml) return false;
  58. return xml;
  59. },
  60. loadFile: function(url, meth, dat){
  61. if(!url) return false;
  62. var doc;
  63. this.xhrsuccess = function(data,str) {
  64. doc = data;
  65. return true;
  66. };
  67. this.xhrerror = function(xhr,err){
  68. doc = null;
  69. return false;
  70. };
  71. if(!meth) meth = "GET";
  72. if(!dat) dat = {};
  73. jQuery.ajax({
  74. type: meth,
  75. url: url,
  76. data: dat,
  77. async: false,
  78. success: this.xhrsuccess,
  79. error: this.xhrerror
  80. });
  81. if(!doc) return false;
  82. if(doc.length == 0) return false;
  83. return doc;
  84. },
  85. transform: function(xsl, xml, options) {
  86. var log = { 'xsl':xsl, 'xml':xml, 'options':options };
  87. options = options || {};
  88. var xml = { 'request':xml, 'doc':this.load(xml, options.meth, options.dat) };
  89. if(xml.doc == false) return false;
  90. var result = { 'xsl':this.load(xsl, options.meth, options.dat) };
  91. if(result.xsl == false) return false;
  92. result.json = false;
  93. if(options.json && xml.doc) {
  94. result.json = xml.doc.selectSingleNode(options.json.toString());
  95. }
  96. var processor = new XSLTProcessor();
  97. processor.importStylesheet( result.xsl );
  98. if(options.params && processor) {
  99. for(key in options.params) {
  100. processor.setParameter(null, key.toString(), options.params[key].toString());
  101. }
  102. }
  103. result.doc = processor.transformToDocument( xml.doc );
  104. var errorTxt = Sarissa.getParseErrorText(result.doc);
  105. if(errorTxt != Sarissa.PARSED_OK) return false;
  106. result.string = this.serialize( result.doc );
  107. result.scripts = jQuery('script',result.doc).text();
  108. return result;
  109. }
  110. };
  111. xslTransform.init();
  112. jQuery.fn.getTransform = function(xsl, xml, options){
  113. var settings = {
  114. append: false,
  115. params: {},
  116. xpath: '',
  117. eval: true,
  118. callback: '',
  119. error: '',
  120. json: false,
  121. meth: "GET",
  122. dat: { }
  123. };
  124. jQuery.extend(settings, options);
  125. if(!xsl || !xml) { return; }
  126. var trans = xslTransform.transform(xsl, xml, settings);
  127. if(trans == false) {
  128. if(settings.error && jQuery.isFunction(settings.error)) {
  129. settings.error.apply(window, [ ]);
  130. }
  131. return;
  132. }
  133. return this.each( function(){
  134. var re = trans.string.match(/<\?xml.*?\?>/);
  135. if(re) { trans.string = trans.string.replace(re, ''); }
  136. try {
  137. if(settings.append) jQuery(this).append(trans.string);
  138. else if(settings.repl) jQuery(this).replaceWith(trans.string);
  139. else jQuery(this).html(trans.string);
  140. } catch(e) {
  141. jQuery(this)[0].innerHTML = trans.string;
  142. }
  143. if(settings.eval && trans.scripts) {
  144. if(trans.scripts.length > 0) {
  145. eval.call(window, trans.scripts);
  146. }
  147. }
  148. if(settings.callback && jQuery.isFunction(settings.callback)) {
  149. var json = false;
  150. if(settings.json && trans.json) eval("json = " + trans.json.firstChild.data);
  151. settings.callback.apply(window, [trans.string, json ]);
  152. }
  153. });
  154. };