diff options
| author | Rob Richards <rrichards@php.net> | 2007-11-28 10:45:16 +0000 |
|---|---|---|
| committer | Rob Richards <rrichards@php.net> | 2007-11-28 10:45:16 +0000 |
| commit | d5afff5286ed627e47da1704e01a4632b2dab967 (patch) | |
| tree | 78f9dce498a939543efa38d8366976ffac99f019 /ext/dom | |
| parent | 1a8b3e0923c54128eff8f882184cd6533557df7e (diff) | |
| download | php-git-d5afff5286ed627e47da1704e01a4632b2dab967.tar.gz | |
MFH: Fix bug #43364 (recursive xincludes don't remove internal nodes properly)
add test
Diffstat (limited to 'ext/dom')
| -rw-r--r-- | ext/dom/document.c | 4 | ||||
| -rw-r--r-- | ext/dom/tests/bug43364.phpt | 40 |
2 files changed, 44 insertions, 0 deletions
diff --git a/ext/dom/document.c b/ext/dom/document.c index f726da0e14..642dcde31e 100644 --- a/ext/dom/document.c +++ b/ext/dom/document.c @@ -1737,6 +1737,10 @@ static void php_dom_remove_xinclude_nodes(xmlNodePtr cur TSRMLS_DC) { /* XML_XINCLUDE_END node will be a sibling of XML_XINCLUDE_START */ while(cur && cur->type != XML_XINCLUDE_END) { + /* remove xinclude processing nodes from recursive xincludes */ + if (cur->type == XML_ELEMENT_NODE) { + php_dom_remove_xinclude_nodes(cur->children TSRMLS_CC); + } cur = cur->next; } diff --git a/ext/dom/tests/bug43364.phpt b/ext/dom/tests/bug43364.phpt new file mode 100644 index 0000000000..0df581b7ac --- /dev/null +++ b/ext/dom/tests/bug43364.phpt @@ -0,0 +1,40 @@ +--TEST-- +Bug #43364 (recursive xincludes don't remove internal xml nodes properly) +--FILE-- +<?php +function loopElements($nodes) +{ + $count = 0; + foreach($nodes as $node) { + if($node instanceof DOMElement) { + $count++; + if($node->childNodes->length > 0) { + $count += loopElements($node->childNodes); + } + } + } + return $count; +} + +$xml = <<<DOC +<?xml version="1.0" encoding="UTF-8"?> +<root xmlns:xi="http://www.w3.org/2001/XInclude"> + <a> + <a_child1>ac1</a_child1> + <a_child2>ac2</a_child2> + </a> + <b><xi:include xpointer="xpointer(/root/a)" /></b> + <c><xi:include xpointer="xpointer(/root/b)" /></c> +</root> +DOC; + +$doc = new DomDocument(); +$doc->loadXml($xml); +$doc->xinclude(); + +$count = loopElements(array($doc->documentElement)); + +var_dump($count); +?> +--EXPECT-- +int(13) |
