You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by am...@apache.org on 2010/04/12 14:17:58 UTC

svn commit: r933212 - /xerces/c/branches/xerces-3.1/src/xercesc/xinclude/XIncludeUtils.cpp

Author: amassari
Date: Mon Apr 12 12:17:58 2010
New Revision: 933212

URL: http://svn.apache.org/viewvc?rev=933212&view=rev
Log:
Restore the usage of the document fragment in XInclude processing to handle xi:include as root elements; delay the recursive expansion of includes until the document fragment has been placed in the final location [XERCESC-1918]

Modified:
    xerces/c/branches/xerces-3.1/src/xercesc/xinclude/XIncludeUtils.cpp

Modified: xerces/c/branches/xerces-3.1/src/xercesc/xinclude/XIncludeUtils.cpp
URL: http://svn.apache.org/viewvc/xerces/c/branches/xerces-3.1/src/xercesc/xinclude/XIncludeUtils.cpp?rev=933212&r1=933211&r2=933212&view=diff
==============================================================================
--- xerces/c/branches/xerces-3.1/src/xercesc/xinclude/XIncludeUtils.cpp (original)
+++ xerces/c/branches/xerces-3.1/src/xercesc/xinclude/XIncludeUtils.cpp Mon Apr 12 12:17:58 2010
@@ -247,6 +247,7 @@ XIncludeUtils::doDOMNodeXInclude(DOMNode
         return false;
     }
 
+    RefVectorOf<DOMNode> delayedProcessing(12,false);
     if (includedDoc == NULL && includedText == NULL){
         /* there was an error - this is now a resource error
            let's see if there is a fallback */
@@ -265,6 +266,7 @@ XIncludeUtils::doDOMNodeXInclude(DOMNode
             XMLUri includedURI(fallback->getBaseURI());
 
             if (fallback->hasChildNodes()){
+                DOMDocumentFragment* frag = parsedDocument->createDocumentFragment();
                 DOMNode *child = fallback->getFirstChild();
                 /* add the content of the fallback element, and remove the fallback elem itself */
                 for ( ; child != NULL ; child=child->getNextSibling()){
@@ -287,10 +289,19 @@ XIncludeUtils::doDOMNodeXInclude(DOMNode
                             ((DOMElement*)newNode)->setAttribute(fgXIBaseAttrName, xil.getLocation());
                         }
                     }
-                    includeParent->insertBefore (newNode, xincludeNode);
-                    parseDOMNodeDoingXInclude(newNode, parsedDocument, entityResolver);
+                    DOMNode *newChild = frag->appendChild(newNode);
+                    // don't process the node now, wait until it is placed in the final position
+                    delayedProcessing.addElement(newChild);
+                    //parseDOMNodeDoingXInclude(newChild, parsedDocument, entityResolver);
+                }
+                includeParent->replaceChild(frag, xincludeNode);
+                frag->release();
+
+                for(XMLSize_t i=0;i<delayedProcessing.size();i++)
+                {
+                    DOMNode* childNode=delayedProcessing.elementAt(i);
+                    parseDOMNodeDoingXInclude(childNode, parsedDocument, entityResolver);
                 }
-                includeParent->removeChild(xincludeNode);
                 modifiedNode = true;
             } else {
                 /* empty fallback element - simply remove it! */
@@ -307,6 +318,8 @@ XIncludeUtils::doDOMNodeXInclude(DOMNode
             /* record the successful include while we process the children */
             addDocumentURIToCurrentInclusionHistoryStack(hrefLoc.getLocation());
 
+            DOMDocumentFragment* frag = parsedDocument->createDocumentFragment();
+            /* need to import the document prolog here */
             DOMNode *child = includedDoc->getFirstChild();
             for (; child != NULL; child = child->getNextSibling()) {
                 if (child->getNodeType() == DOMNode::DOCUMENT_TYPE_NODE)
@@ -373,10 +386,19 @@ XIncludeUtils::doDOMNodeXInclude(DOMNode
                     }
                 }
                 DOMNode *newNode = parsedDocument->importNode(child, true);
-                includeParent->insertBefore (newNode, xincludeNode);
-                parseDOMNodeDoingXInclude(newNode, parsedDocument, entityResolver);
+                DOMNode *newChild = frag->appendChild(newNode);
+                // don't process the node now, wait until it is placed in the final position
+                delayedProcessing.addElement(newChild);
+                //parseDOMNodeDoingXInclude(newChild, parsedDocument, entityResolver);
+            }
+            includeParent->replaceChild(frag, xincludeNode);
+            frag->release();
+
+            for(XMLSize_t i=0;i<delayedProcessing.size();i++)
+            {
+                DOMNode* childNode=delayedProcessing.elementAt(i);
+                parseDOMNodeDoingXInclude(childNode, parsedDocument, entityResolver);
             }
-            includeParent->removeChild(xincludeNode);
             popFromCurrentInclusionHistoryStack(NULL);
             modifiedNode = true;
         } else if (includedText){



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@xerces.apache.org
For additional commands, e-mail: commits-help@xerces.apache.org