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 @@ + + + +
+