📄 applyxslt.java
字号:
{
axe.appendMessage(EOL + "getStylesheet() resulted in ApplyXSLTException" + EOL
+ listener.getMessage());
if (debug) writeLog(axe);
displayException(response, axe, debug);
xslSource = null;
}
// perform Transformation
if ((xmlSource != null) && (xslSource != null))
{
try
{
listener.out.println("Performing transformation...");
Templates templates = tFactory.newTemplates(xslSource);
Transformer transformer = templates.newTransformer();
{
try
{
String contentType = null;
contentType = getContentType(templates);
if (contentType != null);
response.setContentType(contentType);
if (transformer instanceof TransformerImpl)
{
TransformerImpl transformerImpl = (TransformerImpl)transformer;
transformerImpl.setQuietConflictWarnings(ourDefaultParameters.isNoCW(request));
}
setStylesheetParams(transformer, request);
transformer.transform(xmlSource, new StreamResult(response.getOutputStream()));
if (debug)
writeLog(listener.getMessage(), response.SC_OK);
}
catch (Exception exc)
{
ApplyXSLTException axe = new ApplyXSLTException
("Exception occurred during Transformation:"
+ EOL + listener.getMessage() + EOL
+ exc.getMessage(),
exc,
response.SC_INTERNAL_SERVER_ERROR);
if (debug) writeLog(axe);
displayException(response, axe, debug);
}
finally
{
// transformer.reset();
} // end of try ... catch ... finally
}
}
catch (/*org.xml.sax.SAX*/Exception saxExc)
{
ApplyXSLTException axe = new ApplyXSLTException
("Exception occurred during ctor/Transformation:"
+ EOL + listener.getMessage() + EOL
+ saxExc.getMessage(),
saxExc,
response.SC_INTERNAL_SERVER_ERROR);
if (debug) writeLog(axe);
displayException(response, axe, debug);
} // end of new try ... catch
} // end of if((stylesheetRoot != null) ...
if (debug)
{
time = System.currentTimeMillis() - time;
writeLog(" No Conflict Warnings = " + ourDefaultParameters.isNoCW(request) +
" Transformation time: " + time + " ms", response.SC_OK);
}
}
}
/**
* Returns an XML XSLTInputSource DOM. Attempts will be make to create the DOM from the following
* sources:
* <ol>
* <li>A relative URL specified in the HTTP request's path information. This capability is intended
* for use by <b>servlet engines that map</b> some or all XML data to be processed at the server.</li>
* <li>A URL specified in the HTTP request's <code>URL=</code> parameter. This capability
* is intended for <b>clients wishing to selectively process</b> XML data at the server. For
* security reasons, this URL will be forced to the local IP host.</li>
* <li>The HTTP request's XML input stream. This capability is intended for use by chained servlets.</li>
* </ol>
* @param request May contain or point to the XML XSLTInputSource
* @param listener To record detailed parsing messages for possible return to requestor
* @return XML XSLTInputSource DOM, or null if the XSLTInputSource could not be parsed
* @exception ApplyXSLTException Thrown if exception occurs while handling request
*/
protected StreamSource getDocument(HttpServletRequest request,
ApplyXSLTListener listener)
throws ApplyXSLTException
{
try
{
String xmlURL = null;
// document from PathInfo
if ((xmlURL = request.getPathInfo()) != null)
{
listener.out.println("Parsing XML Document from PathInfo: " + xmlURL);
return new StreamSource(new URL("http", ((DefaultApplyXSLTProperties)
ourDefaultParameters).getLocalHost(),
request.getServerPort(),
xmlURL.replace('\\', '/')).openStream());
}
// document from Request parameter
if ((xmlURL = ourDefaultParameters.getXMLurl(request)) != null)
{
listener.out.println("Parsing XML Document from request parameter: " + xmlURL);
return new StreamSource(new URL(xmlURL).openStream());
}
// document from chain
String contentType = request.getContentType();
if ((contentType != null) && contentType.startsWith("text/xml"))
{
listener.out.println("Parsing XML Document from request chain");
return new StreamSource(request.getInputStream());
}
}
catch (IOException ioe)
{
throw new ApplyXSLTException(ioe, HttpServletResponse.SC_NOT_FOUND);
}
catch (Exception e)
{
throw new ApplyXSLTException(e, HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
return null;
}
/**
* Returns a Templates (StylesheetRoot) object. Attempts will be make to create the Stylesheet
* from the followingsources:
* <ol>
* <li>A URL specified in the HTTP request's <code>xslURL=</code> parameter. This capability
* is intended for clients wishing to selectively override the server algorithm for applying XSL
* stylesheets. For security reasons, this URL will be forced to the local IP host.</li>
* <li>XML association. XML documents may contain references to one or more stylesheets using
* <a HREF="http://www.w3.org/TR/1999/PR-xml-stylesheet-19990114">this</a> W3C proposed recommendation.
* If the XML document does contain such references, a best match will be chosen based on the browser
* type making the request and the default association. This capability enables relationships to be
* defined between client capabilities and stylesheets capable of acting on these capabilities.</li>
* <li>A configured default stylesheet URL</li>
* </ol>
* @param request May contain or point to the XSL XSLTInputSource
* @param xmlSource May point to the XSL XSLTInputSource
* @param listener To record detailed parsing messages for possible return to requestor
* @return XSL XSLTInputSource, or null if the request could not be parsed
* @see #makeDocument
* @see #getMedia
* @see #STYLESHEET_ATTRIBUTE
* @see #getXSLURLfromDoc
* @see #toAcceptLanguageConnection
* @exception ApplyXSLTException Thrown if exception occurs while handling request
*/
protected StreamSource getStylesheet(TransformerFactory tFactory,
HttpServletRequest request,
StreamSource xmlSource,
ApplyXSLTListener listener)
throws ApplyXSLTException
{
try
{
//stylesheet URL from request
String xslURL = ((DefaultApplyXSLTProperties) ourDefaultParameters).getXSLRequestURL(request);
if (xslURL != null)
listener.out.println("Parsing XSL Stylesheet Document from request parameter: "
+ xslURL);
else
{
// find stylesheet from XML Document, Media tag preference
if (xmlSource != null){
listener.out.println("calling getXSLURLfromDoc and getMedia " + getMedia(request) );
xslURL = getXSLURLfromDoc(xmlSource, STYLESHEET_ATTRIBUTE, getMedia(request), tFactory);
}
if (xslURL != null)
listener.out.println("Parsing XSL Stylesheet Document from XML Document tag: " + xslURL);
else
// Configuration Default
if ((xslURL = ourDefaultParameters.getXSLurl(null)) != null)
listener.out.println("Parsing XSL Stylesheet Document from configuration: " + xslURL);
}
return new StreamSource(xslURL);
}
catch (IOException ioe)
{
throw new ApplyXSLTException(ioe, HttpServletResponse.SC_NOT_FOUND);
}
catch (Exception e)
{
throw new ApplyXSLTException(e, HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
}
/**
* Returns the response content type specified by the media-type and encoding attributes of
* the <xsl:output> element(s) of the stylesheet.
* @param xslSourceRoot XSL Stylesheet to be examined for <xsl:output> elements.
* @return The response content type (MIME type and charset) of the stylesheet output
* @see #process
*/
public String getContentType(Templates templates)
{
Properties oprops = templates.getOutputProperties();
String encoding = oprops.getProperty(OutputKeys.ENCODING);
String media = oprops.getProperty(OutputKeys.MEDIA_TYPE);
if (media != null)
{
if (encoding != null)
return media + "; charset=" + encoding;
return media;
}
else
{
String method = oprops.getProperty(OutputKeys.METHOD);
if (method.equals("html"))
return "text/html";
else if (method.equals("text"))
return "text/plain";
else
return "text/xml";
}
}
/**
* Defines and sets select top-level XSL stylesheet variables from the HTTP request, which
* can be evaluated using <xsl:param-variable>. The following variables will be
* automatically set:
* <dl>
* <dt><i>ParameterName</i></dt>
* <dd>Each non-reserved request parameter returned from request.getParameterNames(). If a
* parameter contains more than a single value, only the first value is available.</dd>
* <dt>servlet-RemoteAddr</dt>
* <dd>Contains String output from request.getRemoteAddr(), which is the IP address
* of the client machine.</dd>
* <dt>servlet-RemoteHost</dt>
* <dd>Contains String output from request.getRemoteHost(), which is the host name
* of the client machine.</dd>
* <dt>servlet-RemoteUser</dt>
* <dd>Contains String output from request.getRemoteUser(), which was the user name
* accepted by the server to grant access to this servlet.</dd>
* <dt>servlet-Request</dt>
* <dd>Contains the request object.</dd>
* </dl>
* @param xslprocessor Where to register parameters to be set
* @param request Provides access to all meaningful parameters to set
* @see #process
*/
public void setStylesheetParams(Transformer transformer, HttpServletRequest request)
{
Enumeration paramNames = request.getParameterNames();
while (paramNames.hasMoreElements())
{
String paramName = (String) paramNames.nextElement();
try
{
String[] paramVals = request.getParameterValues(paramName);
if (paramVals != null)
transformer.setParameter(paramName, new XString(paramVals[0]));
}
catch (Exception e)
{
}
}
try
{
transformer.setParameter("servlet-RemoteAddr", new XString(request.getRemoteAddr()));
}
catch (Exception e)
{
}
try
{
transformer.setParameter("servlet-RemoteHost", new XString(request.getRemoteHost()));
}
catch (Exception e)
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -