
function xsltProcess(xmlDoc,stylesheet){var output=domCreateDocumentFragment(new XDocument);xsltProcessContext(new ExprContext(xmlDoc),stylesheet,output);var ret=xmlText(output);return ret;}
function xsltProcessContext(input,template,output){var outputDocument=xmlOwnerDocument(output);var nodename=template.nodeName.split(/:/);if(nodename.length==1||nodename[0]!='xsl'){xsltPassThrough(input,template,output,outputDocument);}else{switch(nodename[1]){case'apply-imports':alert('not implemented: '+nodename[1]);break;case'apply-templates':var select=xmlGetAttribute(template,'select');var nodes;if(select){nodes=xpathEval(select,input).nodeSetValue();}else{nodes=input.node.childNodes;}
var sortContext=input.clone(nodes[0],0,nodes);xsltWithParam(sortContext,template);xsltSort(sortContext,template);var mode=xmlGetAttribute(template,'mode');var top=template.ownerDocument.documentElement;var templates=[];for(var i=0;i<top.childNodes.length;++i){var c=top.childNodes[i];if(c.nodeType==DOM_ELEMENT_NODE&&c.nodeName=='xsl:template'&&c.getAttribute('mode')==mode){templates.push(c);}}
for(var j=0;j<sortContext.contextSize();++j){var nj=sortContext.nodelist[j];for(var i=0;i<templates.length;++i){xsltProcessContext(sortContext.clone(nj,j),templates[i],output);}}
break;case'attribute':var nameexpr=xmlGetAttribute(template,'name');var name=xsltAttributeValue(nameexpr,input);var node=domCreateDocumentFragment(outputDocument);xsltChildNodes(input,template,node);var value=xmlValue(node);domSetAttribute(output,name,value);break;case'attribute-set':alert('not implemented: '+nodename[1]);break;case'call-template':var name=xmlGetAttribute(template,'name');var top=template.ownerDocument.documentElement;var paramContext=input.clone();xsltWithParam(paramContext,template);for(var i=0;i<top.childNodes.length;++i){var c=top.childNodes[i];if(c.nodeType==DOM_ELEMENT_NODE&&c.nodeName=='xsl:template'&&domGetAttribute(c,'name')==name){xsltChildNodes(paramContext,c,output);break;}}
break;case'choose':xsltChoose(input,template,output);break;case'comment':var node=domCreateDocumentFragment(outputDocument);xsltChildNodes(input,template,node);var commentData=xmlValue(node);var commentNode=domCreateComment(outputDocument,commentData);output.appendChild(commentNode);break;case'copy':var node=xsltCopy(output,input.node,outputDocument);if(node){xsltChildNodes(input,template,node);}
break;case'copy-of':var select=xmlGetAttribute(template,'select');var value=xpathEval(select,input);if(value.type=='node-set'){var nodes=value.nodeSetValue();for(var i=0;i<nodes.length;++i){xsltCopyOf(output,nodes[i],outputDocument);}}else{var node=domCreateTextNode(outputDocument,value.stringValue());domAppendChild(output,node);}
break;case'decimal-format':alert('not implemented: '+nodename[1]);break;case'element':var nameexpr=xmlGetAttribute(template,'name');var name=xsltAttributeValue(nameexpr,input);var node=domCreateElement(outputDocument,name);domAppendChild(output,node);xsltChildNodes(input,template,node);break;case'fallback':alert('not implemented: '+nodename[1]);break;case'for-each':xsltForEach(input,template,output);break;case'if':var test=xmlGetAttribute(template,'test');if(xpathEval(test,input).booleanValue()){xsltChildNodes(input,template,output);}
break;case'import':alert('not implemented: '+nodename[1]);break;case'include':alert('not implemented: '+nodename[1]);break;case'key':alert('not implemented: '+nodename[1]);break;case'message':alert('not implemented: '+nodename[1]);break;case'namespace-alias':alert('not implemented: '+nodename[1]);break;case'number':alert('not implemented: '+nodename[1]);break;case'otherwise':alert('error if here: '+nodename[1]);break;case'output':break;case'preserve-space':alert('not implemented: '+nodename[1]);break;case'processing-instruction':alert('not implemented: '+nodename[1]);break;case'sort':break;case'strip-space':alert('not implemented: '+nodename[1]);break;case'stylesheet':case'transform':xsltChildNodes(input,template,output);break;case'template':var match=xmlGetAttribute(template,'match');if(match&&xsltMatch(match,input)){xsltChildNodes(input,template,output);}
break;case'text':var text=xmlValue(template);var node=domCreateTextNode(outputDocument,text);output.appendChild(node);break;case'value-of':var select=xmlGetAttribute(template,'select');var value=xpathEval(select,input).stringValue();var node=domCreateTextNode(outputDocument,value);output.appendChild(node);break;case'param':xsltVariable(input,template,false);break;case'variable':xsltVariable(input,template,true);break;case'when':alert('error if here: '+nodename[1]);break;case'with-param':alert('error if here: '+nodename[1]);break;default:alert('error if here: '+nodename[1]);break;}}}
function xsltWithParam(input,template){for(var i=0;i<template.childNodes.length;++i){var c=template.childNodes[i];if(c.nodeType==DOM_ELEMENT_NODE&&c.nodeName=='xsl:with-param'){xsltVariable(input,c,true);}}}
function xsltSort(input,template){var sort=[];for(var i=0;i<template.childNodes.length;++i){var c=template.childNodes[i];if(c.nodeType==DOM_ELEMENT_NODE&&c.nodeName=='xsl:sort'){var select=xmlGetAttribute(c,'select');var expr=xpathParse(select);var type=xmlGetAttribute(c,'data-type')||'text';var order=xmlGetAttribute(c,'order')||'ascending';sort.push({expr:expr,type:type,order:order});}}
xpathSort(input,sort);}
function xsltVariable(input,template,override){var name=xmlGetAttribute(template,'name');var select=xmlGetAttribute(template,'select');var value;if(template.childNodes.length>0){var root=domCreateDocumentFragment(template.ownerDocument);xsltChildNodes(input,template,root);value=new NodeSetValue([root]);}else if(select){value=xpathEval(select,input);}else{value=new StringValue('');}
if(override||!input.getVariable(name)){input.setVariable(name,value);}}
function xsltChoose(input,template,output){for(var i=0;i<template.childNodes.length;++i){var childNode=template.childNodes[i];if(childNode.nodeType!=DOM_ELEMENT_NODE){continue;}else if(childNode.nodeName=='xsl:when'){var test=xmlGetAttribute(childNode,'test');if(xpathEval(test,input).booleanValue()){xsltChildNodes(input,childNode,output);break;}}else if(childNode.nodeName=='xsl:otherwise'){xsltChildNodes(input,childNode,output);break;}}}
function xsltForEach(input,template,output){var select=xmlGetAttribute(template,'select');var nodes=xpathEval(select,input).nodeSetValue();var sortContext=input.clone(nodes[0],0,nodes);xsltSort(sortContext,template);for(var i=0;i<sortContext.contextSize();++i){var ni=sortContext.nodelist[i];xsltChildNodes(sortContext.clone(ni,i),template,output);}}
function xsltChildNodes(input,template,output){var context=input.clone();for(var i=0;i<template.childNodes.length;++i){xsltProcessContext(context,template.childNodes[i],output);}}
function xsltPassThrough(input,template,output,outputDocument){if(template.nodeType==DOM_TEXT_NODE){if(xsltPassText(template)){var node=domCreateTextNode(outputDocument,template.nodeValue);domAppendChild(output,node);}}else if(template.nodeType==DOM_ELEMENT_NODE){var node=domCreateElement(outputDocument,template.nodeName);for(var i=0;i<template.attributes.length;++i){var a=template.attributes[i];if(a){var name=a.nodeName;var value=xsltAttributeValue(a.nodeValue,input);domSetAttribute(node,name,value);}}
domAppendChild(output,node);xsltChildNodes(input,template,node);}else{xsltChildNodes(input,template,output);}}
function xsltPassText(template){if(!template.nodeValue.match(/^\s*$/)){return true;}
var element=template.parentNode;if(element.nodeName=='xsl:text'){return true;}
while(element&&element.nodeType==DOM_ELEMENT_NODE){var xmlspace=domGetAttribute(element,'xml:space');if(xmlspace){if(xmlspace=='default'){return false;}else if(xmlspace=='preserve'){return true;}}
element=element.parentNode;}
return false;}
function xsltAttributeValue(value,context){var parts=stringSplit(value,'{');if(parts.length==1){return value;}
var ret='';for(var i=0;i<parts.length;++i){var rp=stringSplit(parts[i],'}');if(rp.length!=2){ret+=parts[i];continue;}
var val=xpathEval(rp[0],context).stringValue();ret+=val+rp[1];}
return ret;}
function xmlGetAttribute(node,name){var value=domGetAttribute(node,name);if(value){return xmlResolveEntities(value);}else{return value;}};function xsltCopyOf(dst,src,dstDocument){if(src.nodeType==DOM_DOCUMENT_FRAGMENT_NODE||src.nodeType==DOM_DOCUMENT_NODE){for(var i=0;i<src.childNodes.length;++i){arguments.callee(dst,src.childNodes[i],dstDocument);}}else{var node=xsltCopy(dst,src,dstDocument);if(node){for(var i=0;i<src.attributes.length;++i){arguments.callee(node,src.attributes[i],dstDocument);}
for(var i=0;i<src.childNodes.length;++i){arguments.callee(node,src.childNodes[i],dstDocument);}}}}
function xsltCopy(dst,src,dstDocument){if(src.nodeType==DOM_ELEMENT_NODE){var node=domCreateElement(dstDocument,src.nodeName);domAppendChild(dst,node);return node;}
if(src.nodeType==DOM_TEXT_NODE){var node=domCreateTextNode(dstDocument,src.nodeValue);domAppendChild(dst,node);}else if(src.nodeType==DOM_CDATA_SECTION_NODE){var node=domCreateCDATASection(dstDocument,src.nodeValue);domAppendChild(dst,node);}else if(src.nodeType==DOM_COMMENT_NODE){var node=domCreateComment(dstDocument,src.nodeValue);domAppendChild(dst,node);}else if(src.nodeType==DOM_ATTRIBUTE_NODE){domSetAttribute(dst,src.nodeName,src.nodeValue);}
return null;}
function xsltMatch(match,context){var expr=xpathParse(match);var ret;if(expr.steps&&!expr.absolute&&expr.steps.length==1&&expr.steps[0].axis=='child'&&expr.steps[0].predicate.length==0){ret=expr.steps[0].nodetest.evaluate(context).booleanValue();}else{ret=false;var node=context.node;while(!ret&&node){var result=expr.evaluate(context.clone(node,0,[node])).nodeSetValue();for(var i=0;i<result.length;++i){if(result[i]==context.node){ret=true;break;}}
node=node.parentNode;}}
return ret;}