diff --git a/exist-core/pom.xml b/exist-core/pom.xml
index 5065f24d41..be4d2fa04a 100644
--- a/exist-core/pom.xml
+++ b/exist-core/pom.xml
@@ -726,6 +726,7 @@
src/test/xquery/pi.xqm
src/test/xquery/securitymanager/acl.xqm
src/main/java/org/exist/dom/memtree/DocumentTypeImpl.java
+ src/test/resources/org/exist/dom/memtree/simple.xhtml
src/main/java/org/exist/dom/memtree/reference/AbstractReferenceCharacterData.java
src/main/java/org/exist/dom/memtree/reference/AbstractReferenceNodeImpl.java
src/main/java/org/exist/dom/memtree/reference/CommentReferenceImpl.java
@@ -1453,6 +1454,7 @@
src/main/java/org/exist/dom/memtree/NamespaceNode.java
src/main/java/org/exist/dom/memtree/NodeImpl.java
src/main/java/org/exist/dom/memtree/ProcessingInstructionImpl.java
+ src/test/resources/org/exist/dom/memtree/simple.xhtml
src/main/java/org/exist/dom/memtree/reference/AbstractReferenceCharacterData.java
src/main/java/org/exist/dom/memtree/reference/AbstractReferenceNodeImpl.java
src/main/java/org/exist/dom/memtree/reference/CommentReferenceImpl.java
diff --git a/exist-core/src/main/java/org/exist/dom/memtree/DocumentImpl.java b/exist-core/src/main/java/org/exist/dom/memtree/DocumentImpl.java
index de6a1a6853..9270b1652f 100644
--- a/exist-core/src/main/java/org/exist/dom/memtree/DocumentImpl.java
+++ b/exist-core/src/main/java/org/exist/dom/memtree/DocumentImpl.java
@@ -1773,7 +1773,7 @@ public String lookupNamespaceURI(final String prefix) {
if (ns != -1) {
while (ns < nextNamespace && namespaceParent[ns] == nodeNumber) {
final QName nsQName = namespaceCode[ns];
- if (prefix.equals(nsQName.getPrefix())) {
+ if (prefix.equals(nsQName.getPrefix()) || (prefix.equals(XMLConstants.DEFAULT_NS_PREFIX) && nsQName.getPrefix() == null && XMLConstants.XMLNS_ATTRIBUTE.equals(nsQName.getLocalPart()))) {
return nsQName.getNamespaceURI();
}
++ns;
@@ -1787,7 +1787,7 @@ public String lookupNamespaceURI(final String prefix) {
while (parent > nodeNumber) {
parent = next[parent];
}
- if (parent != -1) {
+ if (parent != -1 && !(nodeNumber == 0 && parent == 0)) {
return getInScopePrefix(prefix, parent);
}
}
diff --git a/exist-core/src/test/java/org/exist/dom/memtree/DocumentImplTest.java b/exist-core/src/test/java/org/exist/dom/memtree/DocumentImplTest.java
index 9fba98f120..7fdb1113b9 100644
--- a/exist-core/src/test/java/org/exist/dom/memtree/DocumentImplTest.java
+++ b/exist-core/src/test/java/org/exist/dom/memtree/DocumentImplTest.java
@@ -55,14 +55,14 @@
import org.w3c.dom.*;
import org.xml.sax.*;
+import javax.annotation.Nullable;
import javax.xml.XMLConstants;
import javax.xml.parsers.*;
import java.io.IOException;
import java.io.InputStream;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.junit.Assert.*;
/**
* @author Adam Retter
@@ -178,6 +178,34 @@ public void checkNamespaces_exist() throws IOException, SAXException, ParserConf
assertEquals("http://exist-db.org/xquery/repo", attr2.getValue());
}
+ @Test
+ public void testGetInScopePrefix() throws IOException, ParserConfigurationException, SAXException {
+ final MemTreeBuilder memtreeBuilder = new MemTreeBuilder();
+ final DocumentBuilderReceiver documentBuilderReceiver = new DocumentBuilderReceiver(memtreeBuilder, true);
+
+ try (final InputStream is = getClass().getResourceAsStream("simple.xhtml")) {
+ final SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
+ saxParserFactory.setNamespaceAware(true);
+ final SAXParser saxParser = saxParserFactory.newSAXParser();
+ final XMLReader xmlReader = saxParser.getXMLReader();
+ xmlReader.setContentHandler(documentBuilderReceiver);
+
+ memtreeBuilder.startDocument();
+ xmlReader.parse(new InputSource(is));
+ memtreeBuilder.endDocument();
+ }
+
+ final Document document = memtreeBuilder.getDocument();
+ assertTrue(document instanceof DocumentImpl);
+ final DocumentImpl documentImpl = (DocumentImpl) document;
+
+ final int lastNodeNumber = documentImpl.getLastNode();
+ assertEquals(81, lastNodeNumber);
+
+ @Nullable final String namespaceUri = documentImpl.getInScopePrefix(XMLConstants.DEFAULT_NS_PREFIX, lastNodeNumber);
+ assertEquals(Namespaces.XHTML_NS, namespaceUri);
+ }
+
private Document parseXerces(final InputStream is) throws ParserConfigurationException, SAXException, IOException {
final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
diff --git a/exist-core/src/test/resources/org/exist/dom/memtree/simple.xhtml b/exist-core/src/test/resources/org/exist/dom/memtree/simple.xhtml
new file mode 100644
index 0000000000..da0ba257b9
--- /dev/null
+++ b/exist-core/src/test/resources/org/exist/dom/memtree/simple.xhtml
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
+