1 10 package org.mmbase.bridge.jsp.taglib; 11 import org.mmbase.bridge.jsp.taglib.util.Attribute; 12 import org.mmbase.bridge.jsp.taglib.functions.Functions; 13 import javax.servlet.jsp.JspTagException ; 14 import javax.servlet.http.HttpServletRequest ; 15 16 import org.mmbase.util.logging.Logger; 17 import org.mmbase.util.logging.Logging; 18 19 import javax.xml.transform.stream.StreamSource ; 20 import javax.xml.transform.OutputKeys ; 21 import java.util.Properties ; 22 23 29 30 public class XsltTag extends ContextReferrerTag { 31 32 33 private static final Logger log = Logging.getLoggerInstance(XsltTag.class); 34 35 private Attribute ext = Attribute.NULL; 36 private FormatterTag formatter; 37 38 39 40 46 public void setExtends(String e) throws JspTagException { 47 ext = getAttribute(e); 48 } 49 50 public int doStartTag() throws JspTagException { 51 formatter = (FormatterTag) findParentTag(FormatterTag.class, null, false); 53 if (formatter == null && getId() == null) { 54 throw new JspTagException ("No parent formatter found"); 55 62 } 63 return EVAL_BODY_BUFFERED; 64 } 65 66 69 public int doEndTag() throws JspTagException { 70 String xsltString; 71 String body = bodyContent != null ? bodyContent.getString() : ""; 72 if (getReferid() == null) { 73 xsltString = body.trim(); 74 } else { 75 xsltString = getString(getReferid()); 76 if (! "".equals(body)) { 77 throw new JspTagException ("Cannot use body when using 'referid' attribute'."); 78 } 79 } 80 if (getId() != null) { 81 getContextProvider().getContextContainer().register(getId(), xsltString); 82 } 83 if (formatter != null) { 84 String totalString; 85 if (xsltString.startsWith("<xsl:stylesheet")) { 86 totalString = xsltString; 87 } else { 88 totalString = 89 "<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" " + 90 " xmlns:taglib=\"" + Functions.class.getName() + "\"" + 91 " xmlns:mm=\"" + Functions.class.getName() + "\"" + 92 " xmlns:node=\"" + org.mmbase.bridge.util.xml.NodeFunction.class.getName() + "\""+ 93 " xmlns:o=\"" + org.mmbase.bridge.util.xml.Generator.NAMESPACE + "\"" + 94 " xmlns:mmxf=\"http://www.mmbase.org/xmlns/mmxf\"" + 95 " extension-element-prefixes=\"mm taglib node\"" + 96 " exclude-result-prefixes=\"node mmxf o mm taglib node\"" + 97 " version=\"1.0\"" + 98 " >" + 99 xsltString + 100 "</xsl:stylesheet>"; 101 102 Properties props = new Properties (); 103 props.setProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 104 formatter.setOutputProperties(props); 105 } 106 StreamSource src = new StreamSource (new java.io.StringReader (totalString)); 107 String systemId = ((HttpServletRequest )pageContext.getRequest()).getRequestURL().append('/').append(((long) xsltString.hashCode() & 0xffff)).toString(); 108 src.setSystemId(systemId); 109 if (log.isDebugEnabled()) log.debug("Found xslt " + systemId + ": " + totalString); 110 formatter.setXsltSource(src); 111 } 112 formatter = null; 113 return super.doEndTag(); 114 } 115 } 116 | Popular Tags |