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