You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by sb...@apache.org on 2001/01/07 05:02:01 UTC
cvs commit: xml-xalan/java/src/org/apache/xalan/templates ElemValueOf.java
sboag 01/01/06 20:02:01
Modified: java/src/org/apache/xalan/templates ElemValueOf.java
Log:
Optimize "." patterns to not use an itterator, and also take advantage
of SaxEventDispatch#dispatchCharactersEvent. Addresses performance
issues found with JProbe with large-all_well.xml test.
Revision Changes Path
1.12 +59 -6 xml-xalan/java/src/org/apache/xalan/templates/ElemValueOf.java
Index: ElemValueOf.java
===================================================================
RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/templates/ElemValueOf.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- ElemValueOf.java 2001/01/02 03:36:47 1.11
+++ ElemValueOf.java 2001/01/07 04:02:00 1.12
@@ -63,6 +63,7 @@
import org.apache.xpath.*;
import org.apache.xpath.objects.XString;
import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XNodeSet;
import org.apache.xalan.trace.SelectionEvent;
import org.apache.xml.utils.QName;
import org.apache.xalan.res.XSLTErrorResources;
@@ -70,6 +71,7 @@
import org.apache.xalan.transformer.ResultTreeHandler;
import javax.xml.transform.TransformerException;
+import org.apache.xalan.stree.SaxEventDispatch;
/**
* <meta name="usage" content="advanced"/>
@@ -91,6 +93,8 @@
* @serial
*/
private XPath m_selectExpression = null;
+
+ private boolean m_isDot = false;
/**
* Set the "select" attribute.
@@ -102,6 +106,11 @@
*/
public void setSelect(XPath v)
{
+ if(null != v)
+ {
+ String s = v.getPatternString();
+ m_isDot = (null != s) && s.equals(".");
+ }
m_selectExpression = v;
}
@@ -223,14 +232,58 @@
if (TransformerImpl.S_DEBUG)
transformer.getTraceManager().fireTraceEvent(sourceNode, mode, this);
- XObject value = m_selectExpression.execute(transformer.getXPathContext(),
+ Node child;
+ XObject value;
+
+ // Optimize for "."
+ if(m_isDot && !TransformerImpl.S_DEBUG)
+ {
+ child = sourceNode;
+ value = null;
+ }
+ else
+ {
+ value = m_selectExpression.execute(transformer.getXPathContext(),
sourceNode, this);
-
- if (TransformerImpl.S_DEBUG)
- transformer.getTraceManager().fireSelectedEvent(sourceNode, this,
- "select", m_selectExpression, value);
+ if(value.getType() == XObject.CLASS_NODESET)
+ {
+ org.w3c.dom.traversal.NodeIterator iterator = value.nodeset();
+ child = iterator.nextNode();
+ if(null == child)
+ return;
+ }
+ else
+ child = null;
+ if (TransformerImpl.S_DEBUG)
+ transformer.getTraceManager().fireSelectedEvent(sourceNode, this,
+ "select", m_selectExpression, value);
+ }
+
+ String s;
+ if(null != child)
+ {
+ if (child.isSupported(SaxEventDispatch.SUPPORTSINTERFACE, "1.0"))
+ {
+ if (m_disableOutputEscaping)
+ {
+ ResultTreeHandler rth = transformer.getResultTreeHandler();
+ rth.processingInstruction(javax.xml.transform.Result.PI_DISABLE_OUTPUT_ESCAPING, "");
+ ((SaxEventDispatch) child).dispatchCharactersEvent(rth);
+ rth.processingInstruction(javax.xml.transform.Result.PI_ENABLE_OUTPUT_ESCAPING, "");
+ }
+ else
+ ((SaxEventDispatch) child).dispatchCharactersEvent(transformer.getResultTreeHandler());
+ return;
+ }
+ else
+ {
+ s = XNodeSet.getStringFromNode(child);
+ }
+ }
+ else
+ s = value.str();
- String s = value.str();
+
int len = (null != s) ? s.length() : 0;
if(len > 0)
{