dbertoni 02/03/01 23:18:07
Modified: c/src/XSLT ElemNumber.cpp ElemNumber.hpp
Log:
Fixed bug 6814.
Revision Changes Path
1.53 +96 -9 xml-xalan/c/src/XSLT/ElemNumber.cpp
Index: ElemNumber.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemNumber.cpp,v
retrieving revision 1.52
retrieving revision 1.53
diff -u -r1.52 -r1.53
--- ElemNumber.cpp 23 Feb 2002 04:23:16 -0000 1.52
+++ ElemNumber.cpp 2 Mar 2002 07:18:07 -0000 1.53
@@ -69,6 +69,7 @@
#include <PlatformSupport/DOMStringHelper.hpp>
#include <PlatformSupport/DoubleSupport.hpp>
#include <PlatformSupport/XalanNumberFormat.hpp>
+#include <PlatformSupport/XalanSimplePrefixResolver.hpp>
#include <PlatformSupport/XalanUnicode.hpp>
@@ -81,6 +82,7 @@
+#include <XPath/ElementPrefixResolverProxy.hpp>
#include <XPath/XPath.hpp>
#include <XPath/XObjectFactory.hpp>
@@ -342,14 +344,92 @@
switch(contextNode->getNodeType())
{
case XalanNode::ELEMENT_NODE:
- countMatchPattern =
-
executionContext.createMatchPattern(contextNode->getNodeName(), *this);
+ {
+ // Check to see if we have any fiddling to do with the
match pattern
+ // we create...
+ const XalanDOMString& theNamespaceURI =
contextNode->getNamespaceURI();
+ const XalanDOMString& theNodeName =
contextNode->getNodeName();
+
+ if (isEmpty(theNamespaceURI) == true)
+ {
+ // No namespace URI means no prefix, so this is
easy...
+ assert(isEmpty(contextNode->getLocalName()) ==
true);
+
+ // We can pass any PrefixResolver instance, so
just
+ // pass ourself...
+ countMatchPattern =
+
executionContext.createMatchPattern(theNodeName, *this);
+ }
+ else if (length(theNodeName) !=
length(contextNode->getLocalName()))
+ {
+ // OK, there's a prefix, so create a prefix
resolver so the
+ // prefix can be properly resolved...
+ const XalanElement* const theElement =
+#if defined(XALAN_OLD_STYLE_CASTS)
+ (const XalanElement*)contextNode;
+#else
+ static_cast<const
XalanElement*>(contextNode);
+#endif
+ const ElementPrefixResolverProxy
theProxy(theElement);
+
+ countMatchPattern =
+
executionContext.createMatchPattern(theNodeName, theProxy);
+ }
+ else
+ {
+ // OK, this is ugly. We have to get a unique
prefix and
+ // construct a match pattern with that prefix...
+
StylesheetExecutionContext::GetAndReleaseCachedString
thePrefix(executionContext);
+
+
executionContext.getUniqueNamespaceValue(thePrefix.get());
+
+
StylesheetExecutionContext::GetAndReleaseCachedString
theMatchPatternString(executionContext);
+
+ assign(theMatchPatternString.get(),
thePrefix.get());
+ append(theMatchPatternString.get(),
XalanUnicode::charColon);
+ append(theMatchPatternString.get(),
theNodeName);
+
+ // Use this class to resolve the synthesized
prefix to the
+ // appropriate namespace URI. We could see if
a prefix is
+ // already in scope for the namespace URI, but
it would take
+ // more effort to find that out than it would
to just
+ // create this simple resolver.
+ const XalanSimplePrefixResolver
theResolver(
+
thePrefix.get(),
+
theNamespaceURI,
+
getURI());
+
+ countMatchPattern =
+
executionContext.createMatchPattern(
+
theMatchPatternString.get(),
+ theResolver);
+ }
+ }
break;
case XalanNode::ATTRIBUTE_NODE:
- countMatchPattern = executionContext.createMatchPattern(
- s_atString +
contextNode->getNodeName(),
- *this);
+ {
+ const XalanAttr* const theAttribute =
+#if defined(XALAN_OLD_STYLE_CASTS)
+ (const XalanAttr*)contextNode;
+#else
+ static_cast<const XalanAttr*>(contextNode);
+#endif
+ assert(theAttribute->getOwnerElement() != 0);
+
+ const XalanDOMString& theNodeName =
theAttribute->getNodeName();
+
+ const ElementPrefixResolverProxy
theProxy(theAttribute->getOwnerElement());
+
+ StylesheetExecutionContext::GetAndReleaseCachedString
theMatchPatternString(executionContext);
+
+ assign(theMatchPatternString.get(), s_atString);
+ append(theMatchPatternString.get(), theNodeName);
+
+ countMatchPattern = executionContext.createMatchPattern(
+
theMatchPatternString.get(),
+ theProxy);
+ }
break;
case XalanNode::CDATA_SECTION_NODE:
@@ -369,10 +449,17 @@
break;
case XalanNode::PROCESSING_INSTRUCTION_NODE:
- countMatchPattern = executionContext.createMatchPattern(
- s_piString +
- contextNode->getNodeName() +
- s_leftParenString, *this);
+ {
+ StylesheetExecutionContext::GetAndReleaseCachedString
theMatchPatternString(executionContext);
+
+ assign(theMatchPatternString.get(), s_piString);
+ append(theMatchPatternString.get(),
contextNode->getNodeName());
+ append(theMatchPatternString.get(), s_leftParenString);
+
+ countMatchPattern = executionContext.createMatchPattern(
+ theMatchPatternString.get(),
+ *this);
+ }
break;
default:
1.33 +1 -1 xml-xalan/c/src/XSLT/ElemNumber.hpp
Index: ElemNumber.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemNumber.hpp,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -r1.32 -r1.33
--- ElemNumber.hpp 7 Dec 2001 18:57:56 -0000 1.32
+++ ElemNumber.hpp 2 Mar 2002 07:18:07 -0000 1.33
@@ -69,7 +69,7 @@
-#include "XPath/MutableNodeRefList.hpp"
+#include <XPath/MutableNodeRefList.hpp>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]