/** * $Id$ * $Date$ * */ package org.xmlsh.internal.commands; import java.util.List; import javax.xml.transform.ErrorListener; import javax.xml.transform.Source; import javax.xml.transform.SourceLocator; import javax.xml.transform.TransformerException; import org.xmlsh.core.InputPort; import org.xmlsh.core.Options; import org.xmlsh.core.Options.OptionValue; import org.xmlsh.core.XCommand; import org.xmlsh.core.XValue; import org.xmlsh.core.io.OutputPort; import org.xmlsh.sh.shell.SerializeOpts; import org.xmlsh.sh.shell.Shell; import org.xmlsh.sh.shell.ShellURIResolver; import net.sf.saxon.s9api.MessageListener; import net.sf.saxon.s9api.Processor; import net.sf.saxon.s9api.QName; import net.sf.saxon.s9api.XdmNode; import net.sf.saxon.s9api.XsltCompiler; import net.sf.saxon.s9api.XsltExecutable; import net.sf.saxon.s9api.XsltTransformer; public class xslt extends XCommand { private class myErrorListener implements ErrorListener { @Override public void error(TransformerException exception) throws TransformerException { printErr("Error: " + exception.getMessageAndLocation()); } @Override public void fatalError(TransformerException exception) throws TransformerException { printErr("Fatal Error: " + exception.getMessageAndLocation()); } @Override public void warning(TransformerException exception) throws TransformerException { printErr("Warning : " + exception.getMessageAndLocation()); } } private class myMessageListener implements MessageListener { @Override public void message(XdmNode content, boolean terminate, SourceLocator locator) { printErr(content.getStringValue()); } } @Override public int run(List<XValue> args) throws Exception { Options opts = new Options( "c=context:,cf=context-file:,f=file:,i=input:,n,v", SerializeOpts.getOptionDefs()); opts.parse(args); Processor processor = Shell.getProcessor(); XsltCompiler compiler = processor.newXsltCompiler(); compiler.setErrorListener(new myErrorListener()); Source context = null; InputPort in = null; // Use a copy of the serialize opts so we can override the method SerializeOpts serializeOpts = getSerializeOpts(opts); if(!opts.hasOpt("n")) { // Has XML data input // Order of prevelence // -context // -context-file // -i if(opts.hasOpt("c")) context = opts.getOptValue("c").asSource(); else if(opts.hasOpt("cf")) context = (in = getInput( XValue.newXValue(opts.getOptString("cf", "-")))) .asSource(serializeOpts); else if(opts.hasOpt("i")) context = (in = getInput(opts.getOptValue("i"))) .asSource(serializeOpts); else context = (in = getStdin()).asSource(serializeOpts); } Source source = null; InputPort closePort = null; List<XValue> xvargs = opts.getRemainingArgs(); OptionValue ov = opts.getOpt("f"); if(ov != null) { closePort = getInput(ov.getValue()); if(closePort != null) source = closePort.asSource(serializeOpts); } if(source == null) { throwInvalidArg("No xslt source specified"); } /* * Add namespaces -- DOESNT WORK FOR XSLT * { NameValueMap<String> ns = getEnv().getShell().getNamespaces(); * if( ns != null ){ for( String prefix : ns.keySet() ){ String uri = * ns.get(prefix); compiler.declareNamespace(prefix, uri); * } * } } */ XsltExecutable expr = compiler.compile(source); compiler.setURIResolver(new ShellURIResolver(compiler.getURIResolver())); XsltTransformer eval = expr.load(); eval.setMessageListener(new myMessageListener()); if(context != null) eval.setSource(context); if(opts.hasOpt("v")) { // Read pairs from args to set for(int i = 0; i < xvargs.size() / 2; i++) { String name = xvargs.get(i * 2).toString(); XValue value = xvargs.get(i * 2 + 1); eval.setParameter(new QName(name), value.toXdmValue()); } } OutputPort stdout = getStdout(); eval.setDestination(stdout.asDestination(serializeOpts)); eval.transform(); stdout.writeSequenceTerminator(serializeOpts); return 0; } } // Copyright (C) 2008-2014 David A. Lee. // The contents of this file are subject to the "Simplified BSD License" (the // "License"); // you may not use this file except in compliance with the License. You may // obtain a copy of the // License at http://www.opensource.org/licenses/bsd-license.php // Software distributed under the License is distributed on an "AS IS" basis, // WITHOUT WARRANTY OF ANY KIND, either express or implied. // See the License for the specific language governing rights and limitations // under the License. // The Original Code is: all this file. // The Initial Developer of the Original Code is David A. Lee // Portions created by (your name) are Copyright (C) (your legal entity). All // Rights Reserved. // Contributor(s): none.