1--TEST-- 2Cloning an attribute should retain its namespace 01 3--EXTENSIONS-- 4dom 5--FILE-- 6<?php 7 8function createTestDocument() { 9 $dom = new DOMDocument; 10 $dom->loadXML('<?xml version="1.0"?><container/>'); 11 $dom->documentElement->setAttributeNs("some:ns", "foo:bar", "value"); 12 13 $attr = $dom->documentElement->getAttributeNodeNs("some:ns", "bar"); 14 $clone = $attr->cloneNode(true); 15 16 return [$dom, $clone]; 17} 18 19[$dom, $clone] = createTestDocument(); 20var_dump($clone->prefix, $clone->namespaceURI); 21 22echo "--- Re-adding a namespaced attribute ---\n"; 23 24[$dom, $clone] = createTestDocument(); 25$dom->documentElement->removeAttributeNs("some:ns", "bar"); 26echo $dom->saveXML(); 27$dom->documentElement->setAttributeNodeNs($clone); 28echo $dom->saveXML(); 29 30echo "--- Re-adding a namespaced attribute, with the namespace deleted (setAttributeNodeNs variation) ---\n"; 31 32function readd_test(string $method) { 33 [$dom, $clone] = createTestDocument(); 34 $dom->documentElement->removeAttributeNs("some:ns", "bar"); 35 $dom->documentElement->removeAttribute("xmlns:foo"); 36 echo $dom->saveXML(); 37 $child = $dom->documentElement->appendChild($dom->createElement("child")); 38 $child->{$method}($clone); 39 echo $dom->saveXML(); 40} 41 42readd_test("setAttributeNodeNs"); 43 44echo "--- Re-adding a namespaced attribute, with the namespace deleted (setAttributeNode variation) ---\n"; 45 46readd_test("setAttributeNode"); 47 48echo "--- Re-adding a namespaced attribute, with the namespace deleted (appendChild variation) ---\n"; 49 50readd_test("appendChild"); 51 52echo "--- Removing the document reference should not crash ---\n"; 53 54[$dom, $clone] = createTestDocument(); 55unset($dom); 56var_dump($clone->prefix, $clone->namespaceURI); 57 58?> 59--EXPECT-- 60string(3) "foo" 61string(7) "some:ns" 62--- Re-adding a namespaced attribute --- 63<?xml version="1.0"?> 64<container xmlns:foo="some:ns"/> 65<?xml version="1.0"?> 66<container xmlns:foo="some:ns" foo:bar="value"/> 67--- Re-adding a namespaced attribute, with the namespace deleted (setAttributeNodeNs variation) --- 68<?xml version="1.0"?> 69<container/> 70<?xml version="1.0"?> 71<container><child xmlns:foo="some:ns" foo:bar="value"/></container> 72--- Re-adding a namespaced attribute, with the namespace deleted (setAttributeNode variation) --- 73<?xml version="1.0"?> 74<container/> 75<?xml version="1.0"?> 76<container><child xmlns:foo="some:ns" foo:bar="value"/></container> 77--- Re-adding a namespaced attribute, with the namespace deleted (appendChild variation) --- 78<?xml version="1.0"?> 79<container/> 80<?xml version="1.0"?> 81<container><child xmlns:foo="some:ns" foo:bar="value"/></container> 82--- Removing the document reference should not crash --- 83string(3) "foo" 84string(7) "some:ns" 85