You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by mo...@apache.org on 2001/10/23 21:28:07 UTC
cvs commit: xml-xalan/java/src/org/apache/xalan/xsltc/compiler ApplyImports.java Mode.java Stylesheet.java Template.java
morten 01/10/23 12:28:07
Modified: java/src/org/apache/xalan/xsltc/compiler ApplyImports.java
Mode.java Stylesheet.java Template.java
Log:
A major fix for <xsl:apply-imports/>. This element was previously treated
as <xsl:apply-templates/> but is now handled similar to Java's 'super()'
method. Note that this is not a complete fix. The rest will come tomorrow
or the day after. I just wanted to make sure that today's efforts were not
lost and that they are tested overnight.
PR: bugzilla 1397
Obtained from: n/a
Submitted by: morten@xml.apache.org
Reviewed by: morten@xml.apache.org
Revision Changes Path
1.6 +47 -88 xml-xalan/java/src/org/apache/xalan/xsltc/compiler/ApplyImports.java
Index: ApplyImports.java
===================================================================
RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/ApplyImports.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- ApplyImports.java 2001/06/17 12:23:27 1.5
+++ ApplyImports.java 2001/10/23 19:28:07 1.6
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: ApplyImports.java,v 1.5 2001/06/17 12:23:27 curcuru Exp $
+ * @(#)$Id: ApplyImports.java,v 1.6 2001/10/23 19:28:07 morten Exp $
*
* The Apache Software License, Version 1.1
*
@@ -78,61 +78,52 @@
final class ApplyImports extends Instruction {
- private Expression _select;
private QName _modeName;
private String _functionName;
-
+ private int _precedence;
+
public void display(int indent) {
indent(indent);
Util.println("ApplyTemplates");
indent(indent + IndentIncrement);
- Util.println("select " + _select.toString());
if (_modeName != null) {
indent(indent + IndentIncrement);
Util.println("mode " + _modeName);
}
}
+ /**
+ * Returns true if this <xsl:apply-imports/> element has parameters
+ */
public boolean hasWithParams() {
return hasContents();
}
+ /**
+ * Parse the attributes and contents of an <xsl:apply-imports/> element.
+ */
public void parseContents(Parser parser) {
- final String select = getAttribute("select");
- final String mode = getAttribute("mode");
-
- if (select.length() > 0) {
- _select = parser.parseExpression(this, "select", null);
- }
-
- if (mode.length() > 0) {
- _modeName = parser.getQName(mode);
- }
-
+ // Indi
+ Stylesheet stylesheet = getStylesheet();
+ stylesheet.compileTemplatesAsMethods();
+
+ Template template = getTemplate();
+ _modeName = template.getModeName();
+ _precedence = template.getImportPrecedence();
+
// instantiate Mode if needed, cache (apply temp) function name
- _functionName =
- parser.getTopLevelStylesheet().getMode(_modeName).functionName();
+ stylesheet = parser.getTopLevelStylesheet();
+ _functionName = stylesheet.getMode(_modeName).functionName(_precedence);
+
parseChildren(parser); // with-params
}
+ /**
+ * Type-check the attributes/contents of an <xsl:apply-imports/> element.
+ */
public Type typeCheck(SymbolTable stable) throws TypeCheckError {
- if (_select != null) {
- Type tselect = _select.typeCheck(stable);
- if (tselect instanceof NodeType ||
- tselect instanceof ReferenceType) {
- _select = new CastExpr(_select, Type.NodeSet);
- tselect = Type.NodeSet;
- }
- if (tselect instanceof NodeSetType) {
- typeCheckContents(stable); // with-params
- return Type.Void;
- }
- throw new TypeCheckError(this);
- }
- else {
- typeCheckContents(stable); // with-params
- return Type.Void;
- }
+ typeCheckContents(stable); // with-params
+ return Type.Void;
}
/**
@@ -145,66 +136,34 @@
final InstructionList il = methodGen.getInstructionList();
final int current = methodGen.getLocalIndex("current");
- // check if sorting nodes is required
- final Vector sortObjects = new Vector();
- final Enumeration children = elements();
- while (children.hasMoreElements()) {
- final Object child = children.nextElement();
- if (child instanceof Sort) {
- sortObjects.addElement(child);
- }
- }
-
- // Push a new parameter frame
- if (stylesheet.hasLocalParams()) {
- il.append(classGen.loadTranslet());
- final int pushFrame = cpg.addMethodref(TRANSLET_CLASS,
- PUSH_PARAM_FRAME,
- PUSH_PARAM_FRAME_SIG);
- il.append(new INVOKEVIRTUAL(pushFrame));
- // translate with-params
- translateContents(classGen, methodGen);
- }
-
- // push arguments for final call to applyTemplates
+ // Push the arguments that are passed to applyTemplates()
il.append(classGen.loadTranslet());
il.append(methodGen.loadDOM());
-
- // compute node iterator for applyTemplates
- if (sortObjects.size() > 0) {
- Sort.translateSortIterator(classGen, methodGen,
- _select, sortObjects);
- }
- else {
- if (_select == null) {
- Mode.compileGetChildren(classGen, methodGen, current);
- }
- else {
- _select.translate(classGen, methodGen);
- }
- }
- if (_select != null) {
- _select.startResetIterator(classGen, methodGen);
- }
-
- //!!! need to instantiate all needed modes
- final String className = classGen.getStylesheet().getClassName();
+
+ /*
+ il.append(methodGen.loadIterator());
+ // Make a clone of the current iterator (this also resets)
+ final int clone = cpg.addInterfaceMethodref(NODE_ITERATOR,
+ "cloneIterator",
+ "()"+NODE_ITERATOR_SIG);
+ il.append(new INVOKEINTERFACE(clone, 1));
+ */
+ int init = cpg.addMethodref(SINGLETON_ITERATOR,
+ "<init>", "("+NODE_SIG+")V");
+ il.append(new NEW(cpg.addClass(SINGLETON_ITERATOR)));
+ il.append(DUP);
+ il.append(methodGen.loadCurrentNode());
+ il.append(new INVOKESPECIAL(init));
+
il.append(methodGen.loadHandler());
- final String applyTemplatesSig = classGen.getApplyTemplatesSig();
+
+ // Construct the translet class-name and the signature of the method
+ final String className = classGen.getStylesheet().getClassName();
+ final String signature = classGen.getApplyTemplatesSig();
final int applyTemplates = cpg.addMethodref(className,
_functionName,
- applyTemplatesSig);
+ signature);
il.append(new INVOKEVIRTUAL(applyTemplates));
-
- // Pop parameter frame
- if (stylesheet.hasLocalParams()) {
- il.append(classGen.loadTranslet());
- final int popFrame = cpg.addMethodref(TRANSLET_CLASS,
- POP_PARAM_FRAME,
- POP_PARAM_FRAME_SIG);
- il.append(new INVOKEVIRTUAL(popFrame));
- }
}
-
}
1.13 +323 -6 xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Mode.java
Index: Mode.java
===================================================================
RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Mode.java,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- Mode.java 2001/10/23 13:52:22 1.12
+++ Mode.java 2001/10/23 19:28:07 1.13
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: Mode.java,v 1.12 2001/10/23 13:52:22 morten Exp $
+ * @(#)$Id: Mode.java,v 1.13 2001/10/23 19:28:07 morten Exp $
*
* The Apache Software License, Version 1.1
*
@@ -65,6 +65,8 @@
package org.apache.xalan.xsltc.compiler;
+import java.util.Iterator;
+import java.util.HashSet;
import java.util.Vector;
import java.util.Hashtable;
import java.util.Enumeration;
@@ -82,7 +84,7 @@
private final QName _name; // The QName of this mode
private final Stylesheet _stylesheet; // The owning stylesheet
private final String _methodName; // The method name for this mode
- private final Vector _templates; // All templates in this mode
+ private Vector _templates; // All templates in this mode
// Pattern/test sequence for pattern with node()-type kernel
private Vector _nodeGroup = null;
@@ -96,12 +98,16 @@
private Vector[] _patternGroups;
private TestSeq[] _testSeq;
- private final Hashtable _neededTemplates = new Hashtable();
- private final Hashtable _namedTemplates = new Hashtable();
- private final Hashtable _templateIHs = new Hashtable();
- private final Hashtable _templateILs = new Hashtable();
+ private Hashtable _neededTemplates = new Hashtable();
+ private Hashtable _namedTemplates = new Hashtable();
+ private Hashtable _templateIHs = new Hashtable();
+ private Hashtable _templateILs = new Hashtable();
private LocationPathPattern _rootPattern = null;
+ private HashSet _importLevels = null;
+
+ private Hashtable _keys = null;
+
// Variable index for the current node - used in code generation
private int _currentIndex;
@@ -133,6 +139,12 @@
return _methodName;
}
+ public String functionName(int precedence) {
+ if (_importLevels == null) _importLevels = new HashSet();
+ _importLevels.add(new Integer(precedence));
+ return _methodName+'_'+precedence;
+ }
+
/**
* Shortcut to get the class compiled for this mode (will be inlined).
*/
@@ -152,6 +164,7 @@
* Process all the test patterns in this mode
*/
public void processPatterns(Hashtable keys) {
+ _keys = keys;
// Traverse all templates
final Enumeration templates = _templates.elements();
while (templates.hasMoreElements()) {
@@ -768,6 +781,310 @@
// Append switch() statement - main dispatch loop in applyTemplates()
InstructionHandle disp = body.append(new SWITCH(types, targets, ihLoop));
+
+ // Append all the "case:" statements
+ appendTestSequences(body);
+ // Append the actual template code
+ appendTemplateCode(body);
+
+ // Append NS:* node tests (if any)
+ if (nsElem != null) body.append(nsElem);
+ // Append NS:@* node tests (if any)
+ if (nsAttr != null) body.append(nsAttr);
+
+ // Append default action for element and root nodes
+ body.append(ilRecurse);
+ // Append default action for text and attribute nodes
+ body.append(ilText);
+
+ // putting together constituent instruction lists
+ mainIL.append(new GOTO_W(ihLoop));
+ mainIL.append(body);
+ // fall through to ilLoop
+ mainIL.append(ilLoop);
+
+ peepHoleOptimization(methodGen);
+ methodGen.stripAttributes(true);
+
+ methodGen.setMaxLocals();
+ methodGen.setMaxStack();
+ methodGen.removeNOPs();
+ classGen.addMethod(methodGen.getMethod());
+
+ // Compile method(s) for <xsl:apply-imports/> for this mode
+ if (_importLevels != null) {
+ Iterator levels = _importLevels.iterator();
+ while (levels.hasNext()) {
+ Integer level = (Integer)levels.next();
+ compileApplyImports(classGen, level.intValue());
+ }
+ }
+ }
+
+ private void compileTemplateCalls(ClassGenerator classGen,
+ MethodGenerator methodGen,
+ InstructionHandle next, int level) {
+ Enumeration templates = _neededTemplates.keys();
+ while (templates.hasMoreElements()) {
+ final Template template = (Template)templates.nextElement();
+ if (template.getImportPrecedence() < level) {
+ if (template.hasContents()) {
+ InstructionList til = template.compile(classGen, methodGen);
+ til.append(new GOTO_W(next));
+ _templateILs.put(template, til);
+ _templateIHs.put(template, til.getStart());
+ }
+ else {
+ // empty template
+ _templateIHs.put(template, next);
+ }
+ }
+ }
+ }
+
+
+ public void compileApplyImports(ClassGenerator classGen, int level) {
+ final XSLTC xsltc = classGen.getParser().getXSLTC();
+ final ConstantPoolGen cpg = classGen.getConstantPool();
+ final Vector names = xsltc.getNamesIndex();
+
+ // Clear some datastructures
+ _namedTemplates = new Hashtable();
+ _neededTemplates = new Hashtable();
+ _templateIHs = new Hashtable();
+ _templateILs = new Hashtable();
+ _patternGroups = new Vector[32];
+ _rootPattern = null;
+
+ Vector oldTemplates = _templates;
+ _templates = new Vector();
+ final Enumeration templates = oldTemplates.elements();
+ while (templates.hasMoreElements()) {
+ final Template template = (Template)templates.nextElement();
+ if (template.getImportPrecedence() < level) addTemplate(template);
+ }
+ processPatterns(_keys);
+
+ // (*) Create the applyTemplates() method
+ final de.fub.bytecode.generic.Type[] argTypes =
+ new de.fub.bytecode.generic.Type[3];
+ argTypes[0] = Util.getJCRefType(DOM_INTF_SIG);
+ argTypes[1] = Util.getJCRefType(NODE_ITERATOR_SIG);
+ argTypes[2] = Util.getJCRefType(TRANSLET_OUTPUT_SIG);
+
+ final String[] argNames = new String[3];
+ argNames[0] = DOCUMENT_PNAME;
+ argNames[1] = ITERATOR_PNAME;
+ argNames[2] = TRANSLET_OUTPUT_PNAME;
+
+ final InstructionList mainIL = new InstructionList();
+ final MethodGenerator methodGen =
+ new MethodGenerator(ACC_PUBLIC | ACC_FINAL,
+ de.fub.bytecode.generic.Type.VOID,
+ argTypes, argNames, functionName()+'_'+level,
+ getClassName(), mainIL,
+ classGen.getConstantPool());
+ methodGen.addException("org.apache.xalan.xsltc.TransletException");
+
+ // (*) Create the local variablea
+ final LocalVariableGen current;
+ current = methodGen.addLocalVariable2("current",
+ de.fub.bytecode.generic.Type.INT,
+ mainIL.getEnd());
+ _currentIndex = current.getIndex();
+
+ // (*) Create the "body" instruction list that will eventually hold the
+ // code for the entire method (other ILs will be appended).
+ final InstructionList body = new InstructionList();
+ body.append(NOP);
+
+ // (*) Create an instruction list that contains the default next-node
+ // iteration
+ final InstructionList ilLoop = new InstructionList();
+ ilLoop.append(methodGen.loadIterator());
+ ilLoop.append(methodGen.nextNode());
+ ilLoop.append(DUP);
+ ilLoop.append(new ISTORE(_currentIndex));
+
+ // The body of this code can get very large - large than can be handled
+ // by a single IFNE(body.getStart()) instruction - need workaround:
+ final BranchHandle ifeq = ilLoop.append(new IFEQ(null));
+ final BranchHandle loop = ilLoop.append(new GOTO_W(null));
+ ifeq.setTarget(ilLoop.append(RETURN)); // applyTemplates() ends here!
+ final InstructionHandle ihLoop = ilLoop.getStart();
+
+ // (*) Compile default handling of elements (traverse children)
+ InstructionList ilRecurse =
+ compileDefaultRecursion(classGen, methodGen, ihLoop);
+ InstructionHandle ihRecurse = ilRecurse.getStart();
+
+ // (*) Compile default handling of text/attribute nodes (output text)
+ InstructionList ilText =
+ compileDefaultText(classGen, methodGen, ihLoop);
+ InstructionHandle ihText = ilText.getStart();
+
+ // Distinguish attribute/element/namespace tests for further processing
+ final int[] types = new int[DOM.NTYPES + names.size()];
+ for (int i = 0; i < types.length; i++) types[i] = i;
+
+ final boolean[] isAttribute = new boolean[types.length];
+ final boolean[] isNamespace = new boolean[types.length];
+ for (int i = 0; i < names.size(); i++) {
+ final String name = (String)names.elementAt(i);
+ isAttribute[i+DOM.NTYPES] = isAttributeName(name);
+ isNamespace[i+DOM.NTYPES] = isNamespaceName(name);
+ }
+
+ // (*) Compile all templates - regardless of pattern type
+ compileTemplateCalls(classGen, methodGen, ihLoop, level);
+
+ // (*) Handle template with explicit "*" pattern
+ final TestSeq elemTest = _testSeq[DOM.ELEMENT];
+ InstructionHandle ihElem = ihRecurse;
+ if (elemTest != null)
+ ihElem = elemTest.compile(classGen, methodGen, ihRecurse);
+
+ // (*) Handle template with explicit "@*" pattern
+ final TestSeq attrTest = _testSeq[DOM.ATTRIBUTE];
+ InstructionHandle ihAttr = ihLoop;
+ if (attrTest != null)
+ ihAttr = attrTest.compile(classGen, methodGen, ihAttr);
+
+ // Do tests for id() and key() patterns first
+ InstructionList ilKey = null;
+ if (_idxTestSeq != null) {
+ loop.setTarget(_idxTestSeq.compile(classGen, methodGen, body.getStart()));
+ ilKey = _idxTestSeq.getInstructionList();
+ }
+ else {
+ loop.setTarget(body.getStart());
+ }
+
+ // (*) If there is a match on node() we need to replace ihElem
+ // and ihText (default behaviour for elements & text).
+ if (_nodeTestSeq != null) {
+ double nodePrio = -0.5; //_nodeTestSeq.getPriority();
+ int nodePos = _nodeTestSeq.getPosition();
+ double elemPrio = (0 - Double.MAX_VALUE);
+ int elemPos = Integer.MIN_VALUE;
+ if (elemTest != null) {
+ elemPrio = elemTest.getPriority();
+ elemPos = elemTest.getPosition();
+ }
+ if ((elemPrio == Double.NaN) || (elemPrio < nodePrio) ||
+ ((elemPrio == nodePrio) && (elemPos < nodePos))) {
+ ihElem = _nodeTestSeq.compile(classGen, methodGen, ihLoop);
+ ihText = ihElem;
+ }
+ }
+
+ // (*) Handle templates with "ns:*" pattern
+ InstructionHandle elemNamespaceHandle = ihElem;
+ InstructionList nsElem = compileNamespaces(classGen, methodGen,
+ isNamespace, isAttribute,
+ false, ihElem);
+ if (nsElem != null) elemNamespaceHandle = nsElem.getStart();
+
+ // (*) Handle templates with "ns:@*" pattern
+ InstructionList nsAttr = compileNamespaces(classGen, methodGen,
+ isNamespace, isAttribute,
+ true, ihAttr);
+ InstructionHandle attrNamespaceHandle = ihAttr;
+ if (nsAttr != null) attrNamespaceHandle = nsAttr.getStart();
+
+ // (*) Handle templates with "ns:elem" or "ns:@attr" pattern
+ final InstructionHandle[] targets = new InstructionHandle[types.length];
+ for (int i = DOM.NTYPES; i < targets.length; i++) {
+ final TestSeq testSeq = _testSeq[i];
+ // Jump straight to namespace tests ?
+ if (isNamespace[i]) {
+ if (isAttribute[i])
+ targets[i] = attrNamespaceHandle;
+ else
+ targets[i] = elemNamespaceHandle;
+ }
+ // Test first, then jump to namespace tests
+ else if (testSeq != null) {
+ if (isAttribute[i])
+ targets[i] = testSeq.compile(classGen, methodGen,
+ attrNamespaceHandle);
+ else
+ targets[i] = testSeq.compile(classGen, methodGen,
+ elemNamespaceHandle);
+ }
+ else {
+ targets[i] = ihLoop;
+ }
+ }
+
+ // Handle pattern with match on root node - default: loop
+ targets[DOM.ROOT] = _rootPattern != null
+ ? getTemplateInstructionHandle(_rootPattern.getTemplate())
+ : ihLoop;
+
+ // Handle any pattern with match on text nodes - default: loop
+ targets[DOM.TEXT] = _testSeq[DOM.TEXT] != null
+ ? _testSeq[DOM.TEXT].compile(classGen, methodGen, ihText)
+ : ihText;
+
+ // This DOM-type is not in use - default: process next node
+ targets[DOM.NAMESPACE] = ihLoop;
+
+ // Match unknown element in DOM - default: check for namespace match
+ targets[DOM.ELEMENT] = elemNamespaceHandle;
+
+ // Match unknown attribute in DOM - default: check for namespace match
+ targets[DOM.ATTRIBUTE] = attrNamespaceHandle;
+
+ // Match on processing instruction - default: loop
+ InstructionHandle ihPI = ihLoop;
+ if (_nodeTestSeq != null) ihPI = ihElem;
+ if (_testSeq[DOM.PROCESSING_INSTRUCTION] != null)
+ targets[DOM.PROCESSING_INSTRUCTION] =
+ _testSeq[DOM.PROCESSING_INSTRUCTION].
+ compile(classGen, methodGen, ihPI);
+ else
+ targets[DOM.PROCESSING_INSTRUCTION] = ihPI;
+
+ // Match on comments - default: process next node
+ InstructionHandle ihComment = ihLoop;
+ if (_nodeTestSeq != null) ihComment = ihElem;
+ targets[DOM.COMMENT] = _testSeq[DOM.COMMENT] != null
+ ? _testSeq[DOM.COMMENT].compile(classGen, methodGen, ihComment)
+ : ihComment;
+
+ // Now compile test sequences for various match patterns:
+ for (int i = DOM.NTYPES; i < targets.length; i++) {
+ final TestSeq testSeq = _testSeq[i];
+ // Jump straight to namespace tests ?
+ if ((testSeq == null) || (isNamespace[i])) {
+ if (isAttribute[i])
+ targets[i] = attrNamespaceHandle;
+ else
+ targets[i] = elemNamespaceHandle;
+ }
+ // Match on node type
+ else {
+ if (isAttribute[i])
+ targets[i] = testSeq.compile(classGen, methodGen,
+ attrNamespaceHandle);
+ else
+ targets[i] = testSeq.compile(classGen, methodGen,
+ elemNamespaceHandle);
+ }
+ }
+
+ if (ilKey != null) body.insert(ilKey);
+
+ // Append first code in applyTemplates() - get type of current node
+ final int getType = cpg.addInterfaceMethodref(DOM_INTF,
+ "getType", "(I)I");
+ body.append(methodGen.loadDOM());
+ body.append(new ILOAD(_currentIndex));
+ body.append(new INVOKEINTERFACE(getType, 2));
+
+ // Append switch() statement - main dispatch loop in applyTemplates()
+ InstructionHandle disp = body.append(new SWITCH(types,targets,ihLoop));
// Append all the "case:" statements
appendTestSequences(body);
1.23 +12 -2 xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Stylesheet.java
Index: Stylesheet.java
===================================================================
RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Stylesheet.java,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -r1.22 -r1.23
--- Stylesheet.java 2001/10/19 11:58:40 1.22
+++ Stylesheet.java 2001/10/23 19:28:07 1.23
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: Stylesheet.java,v 1.22 2001/10/19 11:58:40 morten Exp $
+ * @(#)$Id: Stylesheet.java,v 1.23 2001/10/23 19:28:07 morten Exp $
*
* The Apache Software License, Version 1.1
*
@@ -125,7 +125,12 @@
private SourceLoader _loader = null;
+ private boolean _compileTemplatesAsMethods;
+ public void compileTemplatesAsMethods() {
+ _compileTemplatesAsMethods = true;
+ }
+
public boolean isSimplified() {
return(_simplified);
}
@@ -351,7 +356,7 @@
SyntaxTreeNode child = (SyntaxTreeNode)contents.elementAt(i);
if ((child instanceof Import) || (child instanceof Include)) {
parser.getSymbolTable().setCurrentNode(child);
- child.parseContents(parser);
+ child.parseContents(parser);
}
}
@@ -363,6 +368,11 @@
!(child instanceof Include)) {
parser.getSymbolTable().setCurrentNode(child);
child.parseContents(parser);
+ }
+ if (_compileTemplatesAsMethods && (child instanceof Template)) {
+ Template template = (Template)child;
+ String name = "template$dot$"+template.getPosition();
+ template.setName(parser.getQName(name));
}
}
}
1.13 +6 -3 xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Template.java
Index: Template.java
===================================================================
RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Template.java,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- Template.java 2001/10/18 10:29:07 1.12
+++ Template.java 2001/10/23 19:28:07 1.13
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: Template.java,v 1.12 2001/10/18 10:29:07 morten Exp $
+ * @(#)$Id: Template.java,v 1.13 2001/10/23 19:28:07 morten Exp $
*
* The Apache Software License, Version 1.1
*
@@ -140,6 +140,10 @@
return _name;
}
+ public void setName(QName qname) {
+ if (_name == null) _name = qname;
+ }
+
public QName getModeName() {
return _mode;
}
@@ -313,9 +317,7 @@
String className = classGen.getClassName();
if (_compiled && isNamed()){
-
String methodName = Util.escape(_name.toString());
-
il.append(classGen.loadTranslet());
il.append(methodGen.loadDOM());
il.append(methodGen.loadIterator());
@@ -331,6 +333,7 @@
return;
}
+ if (_compiled) return;
_compiled = true;
if (_hasVariableFrame) {
---------------------------------------------------------------------
To unsubscribe, e-mail: xalan-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xalan-cvs-help@xml.apache.org