morten      01/08/08 05:30:04

  Modified:    java/src/org/apache/xalan/xsltc/compiler Copy.java
  Log:
  Fix for use of attribute sets with the xsl:copy element. We were a bit too
  restrictive in our tests to see if it was safe to send the attributes to
  the output handler. We only compiled in a test to see if the copied node
  was an elment, but should also have tested if the xsl:copy element's
  parent node was a LRE or a xsl:element element.
  PR:           bugzilla 2538
  Obtained from:        n/a
  Submitted by: [EMAIL PROTECTED]
  Reviewed by:  [EMAIL PROTECTED]
  
  Revision  Changes    Path
  1.5       +29 -13    xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Copy.java
  
  Index: Copy.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Copy.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- Copy.java 2001/08/08 10:57:05     1.4
  +++ Copy.java 2001/08/08 12:30:03     1.5
  @@ -1,5 +1,5 @@
   /*
  - * @(#)$Id: Copy.java,v 1.4 2001/08/08 10:57:05 morten Exp $
  + * @(#)$Id: Copy.java,v 1.5 2001/08/08 12:30:03 morten Exp $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -115,6 +115,7 @@
                                        Util.getJCRefType("I"),
                                        il.getEnd());
   
  +     // Get the name of the node to copy and save for later
        il.append(methodGen.loadDOM());
        il.append(methodGen.loadCurrentNode());
        il.append(methodGen.loadHandler());
  @@ -128,27 +129,42 @@
        il.append(DUP);
        il.append(new ASTORE(name.getIndex()));
        final BranchHandle ifBlock1 = il.append(new IFNULL(null));
  +
  +     // Get the length of the node name and save for later
        il.append(new ALOAD(name.getIndex()));
        final int lengthMethod = cpg.addMethodref(STRING_CLASS,"length","()I");
        il.append(new INVOKEVIRTUAL(lengthMethod));
  -     // save length for later tests
        il.append(new ISTORE(length.getIndex()));
  -     // only if use-attribute-sets specified compile this seq
  +
  +     // Copy in attribute sets if specified
        if (_useSets != null) {
  -         // check if element; if not skip to translate body
  -         il.append(new ILOAD(length.getIndex()));
  -         final BranchHandle ifBlock2 = il.append(new IFEQ(null));
  -         // length != 0 -> element -> do attribute sets
  -         _useSets.translate(classGen, methodGen);
  -         // not an element; root
  -         ifBlock2.setTarget(il.append(NOP));
  +         // If the parent of this element will result in an element being
  +         // output then we know that it is safe to copy out the attributes
  +         final SyntaxTreeNode parent = getParent();
  +         if ((parent instanceof LiteralElement) ||
  +             (parent instanceof LiteralElement)) {
  +             _useSets.translate(classGen, methodGen);
  +         }
  +         // If not we have to check to see if the copy will result in an
  +         // element being output.
  +         else {
  +             // check if element; if not skip to translate body
  +             il.append(new ILOAD(length.getIndex()));
  +             final BranchHandle ifBlock2 = il.append(new IFEQ(null));
  +             // length != 0 -> element -> do attribute sets
  +             _useSets.translate(classGen, methodGen);
  +             // not an element; root
  +             ifBlock2.setTarget(il.append(NOP));
  +         }
        }
  -     // instantiate body of xsl:copy
  +
  +     // Instantiate body of xsl:copy
        translateContents(classGen, methodGen);
  -     // check if element
  +
  +     // Call the output handler's endElement() if we copied an element
  +     // (The DOM.shallowCopy() method calls startElement().)
        il.append(new ILOAD(length.getIndex()));
        final BranchHandle ifBlock3 = il.append(new IFEQ(null));
  -     // emit endElement
        il.append(methodGen.loadHandler());
        il.append(new ALOAD(name.getIndex()));
        il.append(methodGen.endElement());
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to