Hi Ernesto,
This bug has already been fixed, so you might want to try building from the
latest CVS code, or from a CVS snapshot.
Thanks!
Dave
"Ernesto Santos"
<ernesto.santos@mog-sol To:
<[EMAIL PROTECTED]>
utions.com> cc: (bcc: David N
Bertoni/Cambridge/IBM)
Subject: prefix resolving
problem
02/04/2003 06:32 AM
Please respond to
xalan-dev
Hi
I sent this message on February 1st but I don't see it in the list archive
so I'm sending
it again in case there was some problem.
I've been using XalanC 1.4 and have the following problem:
I loaded the following XML document (which happens to be an XSD)
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:annotation>
<xs:appinfo source="my_app">my_schema</xs:appinfo>
</xs:annotation>
</xs:schema>
Using XPathEvaluator::selectNodeList I executed the expression "/xs:schema"
and it worked fine, I got back one node.
But then I added a default namespace to the first elemennt
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns="some_uri" xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:annotation>
<xs:appinfo source="my_app">my_schema</xs:appinfo>
</xs:annotation>
</xs:schema>
executing the spath expressions I got the following results
"/xs:schema" - the returned NodeList is empty
"/*" - the returned NodeList has one node
"/*[local-name()='schema']" - the returned NodeList has one node
So it seemed to me there was a problem resolving prefixes
I went to the source code and found the
DOMServices::getNamespaceForPrefix
The algorithm doesn't seem to take into account the presenc of a default
namespace so I patched it with this
"(equals(prefix,"")) && "
the code excerpt follows
if ( (equals(prefix,"")) && (equals(aname, s_XMLNamespace) == true))
{
theNamespace = &attr->getNodeValue();
break;
}
else if (startsWith(aname, s_XMLNamespaceWithSeparator) == true)
{
if (equals(
prefix,
c_wstr(aname) + s_XMLNamespaceWithSeparatorLength) ==
true)
{
theNamespace = &attr->getNodeValue();
break;
}
}
It seems to work now but I'm not sure if this will break any other part of
the code.
Thanks in advance
Ernesto