xsl 里增加
function valueOf(context, elem) {
return tools.valueOf(context, elem);
}
代碼里增加
public String valueOf(XSLProcessorContext context, ElemExtensionCall elem) {
String value = elem.getAttribute("select");
String maxStr = elem.getAttribute("max");
try {
value = executeExpression(context, elem, value);
} catch (TransformerException e) {
}
if (isNotBlank(maxStr)) {
try {
int max = Integer.parseInt(maxStr);
value = shortStr(value, max);
} finally {
}
}
return value;
}private String executeExpression(XSLProcessorContext context, ElemExtensionCall elem, String value)
throws TransformerException {
XPathContext xctxt = context.getTransformer().getXPathContext();
XPath path = new XPath(value, elem, xctxt.getNamespaceContext(), XPath.SELECT);
XObject data = path.execute(xctxt, context.getContextNode(), elem);
if (data != null)
value = data.xstr().toString();
return value == null ? "" : value;
}
參考了下面的文檔
[prev in list] [next in list] [prev in thread] [next in thread] List: xalan-j-users Subject: Re: Extension element with subelements From: John Gentilin <gentijo () eyecatching ! com> Date: 2007-09-07 21:48:37 Message-ID: 46E1C735.2080504 () eyecatching ! com [Download message RAW] Oops... this might be what you are after instead... executeChildTemplatesToXML or ToString or ToXMLString may be what you are after.. /** * A repository for common functions that can be used but the extension * functions and extension elements. * * * Title: Base Functions * Copyright: Copyright (c) 2005 * Company: Eye Catching Solutions Inc. * @version 1.0 * @author John Gentilin */ public class BaseFunctions { private static Category m_Log = Category.getInstance("RapidXSL.Interface"); private static DocumentBuilderFactory m_dfactory = null; private static DocumentBuilder m_docBuilder = null; /** * @param context * @param elem * @throws TransformerException */ protected void executeChildTemplates( XSLProcessorContext context, ElemExtensionCall elem ) throws TransformerException { TransformerImpl transf = context.getTransformer(); transf.executeChildTemplates(elem, context.getContextNode(), context.getMode(), transf.getResultTreeHandler()); } /** * @param context * @param elem * @throws TransformerException */ protected Document executeChildTemplatesToXML(Document doc, XSLProcessorContext context, ElemExtensionCall elem ) throws XMLServerException { DOMBuilder builder = null; TransformerImpl transformer = context.getTransformer(); try { builder = new DOMBuilder(doc); transformer.executeChildTemplates(elem, context.getContextNode(), context.getMode(), builder); } catch (Exception e) { throw new XMLServerException("RXSL_IFACE", "XSL Interface Error - " + e.getLocalizedMessage()); } return doc; } /** * @param context * @param elem * @throws TransformerException */ protected String executeChildTemplatesToString(XSLProcessorContext context, ElemExtensionCall elem ) throws XMLServerException { TransformerImpl transformer = context.getTransformer(); try { TextSerializationHandler handler = new TextSerializationHandler(); transformer.executeChildTemplates(elem, context.getContextNode(), context.getMode(), handler); return handler.toString(); } catch (Exception e) { throw new XMLServerException("RXSL_IFACE", "XSL Interface Error - " + e.getLocalizedMessage()); } } protected String executeChildTemplatestoXMLString(XSLProcessorContext context, ElemExtensionCall elem) throws TransformerException, SAXException { try { TransformerImpl transformer = context.getTransformer(); // This should be worked on so that the output format can be // defined by a first child of the redirect element. OutputProperties format = transformer.getOutputFormat(); Properties prop = format.getProperties(); format.setProperty("indent","no"); format.setProperty("{[prev in list] [next in list] [prev in thread] [next in thread]