tomcat-taglibs-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Jeremy Boynes <>
Subject Re: xalan usage in taglibs
Date Sun, 26 Nov 2017 16:33:58 GMT
On Nov 26, 2017, at 6:32 AM, Matthew Broadhead <> wrote:
> Hi,
> I am currently evaluating whether the Xalan dependency can be dropped from taglibs and
replaced with javax.xml.*.
> The reason for this is a conflict which occurs when I have Apache Fop as a dependency:
> java.lang.ClassCastException: org.apache.xml.dtm.ref.DTMManagerDefault cannot be cast
to org.apache.xml.dtm.DTMManager
>     at org.apache.xml.dtm.DTMManager.newInstance(
>     at org.apache.xpath.XPathContext.<init>(
>     at org.apache.xpath.XPathContext.<init>(
>     at org.apache.xpath.XPathContext.<init>(
>     at org.apache.xalan.transformer.TransformerImpl.<init>(
>     at org.apache.xalan.templates.StylesheetRoot.newTransformer(
> In org.apache.taglibs.standard.tag.common.xml it seems like org.apache.xpath.XPath could
be replaced with javax.xml.xpath.XPathExpression.
> But the thing I don't understand is the method getContext in org.apache.taglibs.standard.tag.common.xml.XalanUtil
uses a VariableStack and returns an XPathContext.  I am not sure how they fit into the SAX
(?) model.
> Can anyone shed some light on the inner workings of this function?

This was added <> in
1.2.x to fix a performance problem (bug #27717 <>)
with x:forEach. At the time, the default XPath implementation in javax.xml had the same n^2
behaviour as the previous implementation. There are some micro-benchmarks <>
still in the test class if you want to see if that’s still true.

Memory is a little fuzzy, but IIRC the JSTLVariableStack is used to make the JSP implicit
variables (e.g. ${request.something}) resolvable in the transform. It’s the low-level equivalent
of a custom XPathVariableResolver.

If you’re not using the XML tags, you may be able to simply drop the Xalan dependency from
your application to avoid the conflict.
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message