Hey all, I think I've found a bug when using the key() function on a key-name that is a QName. Unfortunately, I'm having a really hard time recreating it in a minimal version; it only seems to happen in the context of my very large stylesheet. It also seems to be related to my use of xsl:import, as the place where this occurs is about 4 import-levels down, and two or three of those upper levels also declare the offending namespace. If I don't import the offending stylesheet and use it alone, the bug doesn't happen.
I can't really post my whole application, as a lot of it is proprietary. But here are the lines that seem to be causing the problem directly: <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:doc="http://foo.com/namespace" xmlns="http://foo.com/output"> <xsl:key name="doc:element.type" match="doc:element" use="@type"/> ... <xsl:for-each select="//doc:element[count(key('doc:element.type', @type)[1] | .) = 1]"> ... </xsl:for-each> </xsl:stylesheet> According to the error, it says that "doc" must resolve to a namespace. Obviously, it is (see the xmlns:doc="..."). If I take out the 'doc:' prefix from the key names, it works fine. Here is the top portion of the stack trace: javax.xml.transform.TransformerException: java.lang.RuntimeException: Prefix must resolve to a namespace: doc at org.apache.xalan.transformer.TransformerImpl.transformNode(TransformerImpl.java:1226) at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:638) at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:1088) at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:1066) at org.apache.xalan.xslt.Process.main(Process.java:865) Caused by: java.lang.RuntimeException: Prefix must resolve to a namespace: doc at org.apache.xml.utils.QName.<init>(QName.java:328) at org.apache.xalan.templates.FuncKey.execute(FuncKey.java:116) at org.apache.xpath.Expression.asIterator(Expression.java:273) at org.apache.xpath.axes.FilterExprWalker.setRoot(FilterExprWalker.java:162) at org.apache.xpath.axes.WalkingIterator.reset(WalkingIterator.java:110) at org.apache.xpath.axes.LocPathIterator.setRoot(LocPathIterator.java:373) at org.apache.xpath.axes.LocPathIterator.asIterator(LocPathIterator.java:267) at org.apache.xpath.axes.UnionPathIterator.setRoot(UnionPathIterator.java:132) at org.apache.xpath.axes.UnionPathIterator.asIterator(UnionPathIterator.java:510) at org.apache.xpath.functions.FuncCount.execute(FuncCount.java:92) at org.apache.xpath.operations.Operation.execute(Operation.java:143) at org.apache.xpath.axes.PredicatedNodeTest.executePredicates(PredicatedNodeTest.java:307) at org.apache.xpath.axes.PredicatedNodeTest.acceptNode(PredicatedNodeTest.java:438) at org.apache.xpath.axes.WalkingIteratorSorted.setRoot(WalkingIteratorSorted.java:212) at org.apache.xpath.axes.LocPathIterator.asIterator(LocPathIterator.java:267) at org.apache.xalan.templates.ElemForEach.transformSelectedNodes(ElemForEach.java:357) ... forever :) I'm really sorry I can't give you a better example to let you recreate it yourselves -- I tried :). Thanks to anyone who has a clue about what could be going wrong. Your help is much appreciated. In the meantime, I'll be using Saxon :( -- Peter Davis You have the capacity to learn from mistakes. You'll learn a lot today.
