You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by db...@apache.org on 2002/09/21 03:24:43 UTC
cvs commit: xml-xalan/c/src/XSLT AVT.cpp AVT.hpp AVTPart.hpp AVTPartSimple.cpp AVTPartSimple.hpp ElemAttribute.cpp ElemAttributeSet.cpp ElemCallTemplate.cpp ElemDecimalFormat.cpp ElemElement.cpp ElemExtensionCall.cpp ElemExtensionCall.hpp ElemIf.cpp ElemLiteralResult.cpp ElemLiteralResult.hpp ElemNumber.cpp ElemPI.cpp ElemSort.cpp ElemTemplateElement.cpp ElemTemplateElement.hpp ElemTextLiteral.cpp ElemTextLiteral.hpp FunctionKey.cpp KeyTable.cpp KeyTable.hpp ResultNamespacesStack.cpp ResultNamespacesStack.hpp StylesheetConstructionContext.hpp StylesheetConstructionContextDefault.cpp StylesheetConstructionContextDefault.hpp StylesheetExecutionContext.hpp StylesheetExecutionContextDefault.cpp StylesheetExecutionContextDefault.hpp StylesheetHandler.cpp StylesheetHandler.hpp StylesheetRoot.cpp StylesheetRoot.hpp XSLTEngineImpl.cpp XSLTEngineImpl.hpp
dbertoni 2002/09/20 18:24:43
Modified: c/src/XSLT AVT.cpp AVT.hpp AVTPart.hpp AVTPartSimple.cpp
AVTPartSimple.hpp ElemAttribute.cpp
ElemAttributeSet.cpp ElemCallTemplate.cpp
ElemDecimalFormat.cpp ElemElement.cpp
ElemExtensionCall.cpp ElemExtensionCall.hpp
ElemIf.cpp ElemLiteralResult.cpp
ElemLiteralResult.hpp ElemNumber.cpp ElemPI.cpp
ElemSort.cpp ElemTemplateElement.cpp
ElemTemplateElement.hpp ElemTextLiteral.cpp
ElemTextLiteral.hpp FunctionKey.cpp KeyTable.cpp
KeyTable.hpp ResultNamespacesStack.cpp
ResultNamespacesStack.hpp
StylesheetConstructionContext.hpp
StylesheetConstructionContextDefault.cpp
StylesheetConstructionContextDefault.hpp
StylesheetExecutionContext.hpp
StylesheetExecutionContextDefault.cpp
StylesheetExecutionContextDefault.hpp
StylesheetHandler.cpp StylesheetHandler.hpp
StylesheetRoot.cpp StylesheetRoot.hpp
XSLTEngineImpl.cpp XSLTEngineImpl.hpp
Log:
Performance tweaks and new functionality.
Revision Changes Path
1.17 +21 -45 xml-xalan/c/src/XSLT/AVT.cpp
Index: AVT.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/AVT.cpp,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- AVT.cpp 6 May 2002 05:31:57 -0000 1.16
+++ AVT.cpp 21 Sep 2002 01:24:41 -0000 1.17
@@ -109,6 +109,10 @@
+const XalanDOMString AVT::s_emptyString;
+
+
+
/**
* Construct an AVT by parsing the string, and either
* constructing a vector of AVTParts, or simply hold
@@ -117,16 +121,13 @@
AVT::AVT(
const Locator* locator,
const XalanDOMChar* name,
- const XalanDOMChar* type,
const XalanDOMChar* stringedValue,
const PrefixResolver& resolver,
StylesheetConstructionContext& constructionContext) :
m_parts(),
- m_simpleString(),
- // $$$ ToDo: Explicit XalanDOMString constructor
- m_name(XalanDOMString(name)),
- m_prefix(getPrefix(name)),
- m_pcType(type)
+ m_simpleString(0),
+ m_simpleStringLength(0),
+ m_name(constructionContext.getPooledString(name))
{
StringTokenizer tokenizer(stringedValue, theTokenDelimiterCharacters, true);
@@ -134,7 +135,9 @@
if(nTokens < 2)
{
- m_simpleString = stringedValue; // then do the simple thing
+ // Do the simple thing
+ m_simpleStringLength = length(stringedValue);
+ m_simpleString = constructionContext.allocateVector(stringedValue, m_simpleStringLength, false);
}
else
{
@@ -183,7 +186,7 @@
{
if(length(buffer) > 0)
{
- m_parts.push_back(new AVTPartSimple(buffer));
+ m_parts.push_back(new AVTPartSimple(constructionContext, c_wstr(buffer), length(buffer)));
clear(buffer);
}
@@ -310,19 +313,14 @@
if(length(buffer) > 0)
{
- m_parts.push_back(new AVTPartSimple(buffer));
+ m_parts.push_back(new AVTPartSimple(constructionContext, c_wstr(buffer), length(buffer)));
clear(buffer);
}
} // end else nTokens > 1
- if(m_parts.empty() && length(m_simpleString) == 0)
- {
- // Error?
- clear(m_simpleString);
- }
- else if (m_parts.size() < m_parts.capacity())
+ if (m_parts.size() < m_parts.capacity())
{
AVTPartPtrVectorType(m_parts).swap(m_parts);
}
@@ -346,30 +344,23 @@
void
-AVT::evaluate(
+AVT::doEvaluate(
XalanDOMString& buf,
XalanNode* contextNode,
const PrefixResolver& prefixResolver,
XPathExecutionContext& executionContext) const
{
- if(length(m_simpleString) > 0)
- {
- buf = m_simpleString;
- }
- else
+ clear(buf);
+
+ if(m_parts.empty() == false)
{
- clear(buf);
+ const AVTPartPtrVectorType::size_type n = m_parts.size();
- if(m_parts.empty() == false)
+ for(AVTPartPtrVectorType::size_type i = 0; i < n; i++)
{
- const AVTPartPtrVectorType::size_type n = m_parts.size();
-
- for(AVTPartPtrVectorType::size_type i = 0; i < n; i++)
- {
- assert(m_parts[i] != 0);
+ assert(m_parts[i] != 0);
- m_parts[i]->evaluate(buf, contextNode, prefixResolver, executionContext);
- }
+ m_parts[i]->evaluate(buf, contextNode, prefixResolver, executionContext);
}
}
}
@@ -393,20 +384,5 @@
else
{
tokenizer.nextToken(token);
- }
-}
-
-
-
-XalanDOMString
-AVT::getPrefix(const XalanDOMChar* theName)
-{
- if (startsWith(theName, DOMServices::s_XMLNamespaceWithSeparator) == true)
- {
- return XalanDOMString(theName, DOMServices::s_XMLNamespaceWithSeparatorLength);
- }
- else
- {
- return XalanDOMString();
}
}
1.14 +33 -55 xml-xalan/c/src/XSLT/AVT.hpp
Index: AVT.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/AVT.hpp,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- AVT.hpp 7 Dec 2001 19:58:10 -0000 1.13
+++ AVT.hpp 21 Sep 2002 01:24:41 -0000 1.14
@@ -101,7 +101,6 @@
*
* @param ownerElement the Locator for the AVT. May be null.
* @param name name of AVT
- * @param type type of AVT
* @param stringedValue string value to parse
* @param resolver resolver for namespace resolution
* @param constructionContext context for construction of AVT
@@ -109,7 +108,6 @@
AVT(
const Locator* locator,
const XalanDOMChar* name,
- const XalanDOMChar* type,
const XalanDOMChar* stringedValue,
const PrefixResolver& resolver,
StylesheetConstructionContext& constructionContext);
@@ -128,46 +126,22 @@
return m_name;
}
- /**
- * Retrieve the prefix of the name of the Attribute Value Template,
- * if any.
- *
- * @return The prefix part of the AVT's name
- */
- const XalanDOMString&
- getPrefix() const
- {
- return m_prefix;
- }
-
- /**
- * Retrieve the type of the Attribute Value Template
- *
- * @return type of AVT
- */
- const XalanDOMString&
- getType() const
- {
- return m_pcType;
- }
-
- /**
- * Retrieve the "simple" value
- *
- * @return The "simple" value of the AVT.
- */
- const XalanDOMString&
- getSimpleValue() const
- {
- return m_simpleString;
- }
-
void
evaluate(
XalanDOMString& buf,
XalanNode* contextNode,
const PrefixResolver& prefixResolver,
- XPathExecutionContext& executionContext) const;
+ XPathExecutionContext& executionContext) const
+ {
+ if(m_simpleString != 0)
+ {
+ buf.assign(m_simpleString, m_simpleStringLength);
+ }
+ else
+ {
+ doEvaluate(buf, contextNode, prefixResolver, executionContext);
+ }
+ }
#if defined(XALAN_NO_NAMESPACES)
typedef vector<const AVTPart*> AVTPartPtrVectorType;
@@ -178,35 +152,39 @@
private:
void
+ doEvaluate(
+ XalanDOMString& buf,
+ XalanNode* contextNode,
+ const PrefixResolver& prefixResolver,
+ XPathExecutionContext& executionContext) const;
+
+ void
nextToken(
StylesheetConstructionContext& constructionContext,
const Locator* locator,
StringTokenizer& tokenizer,
XalanDOMString& token);
- /**
- * Get the prefix from theName, if any.
- *
- * @param theName name of AVT
- *
- * @return A string containing the prefix.
- */
- XalanDOMString
- getPrefix(const XalanDOMChar* theName);
-
// not implemented
- AVT(const AVT &);
- AVT& operator=(const AVT &);
+ AVT(const AVT&);
+
+ AVT&
+ operator=(const AVT&);
+
+ bool
+ operator==(const AVT&) const;
+
- AVTPartPtrVectorType m_parts;
+ // Data members...
+ AVTPartPtrVectorType m_parts;
- XalanDOMString m_simpleString;
+ const XalanDOMChar* m_simpleString;
- const XalanDOMString m_name;
+ XalanDOMString::size_type m_simpleStringLength;
- const XalanDOMString m_prefix;
+ const XalanDOMString& m_name;
- const XalanDOMString m_pcType;
+ static const XalanDOMString s_emptyString;
};
1.5 +2 -6 xml-xalan/c/src/XSLT/AVTPart.hpp
Index: AVTPart.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/AVTPart.hpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- AVTPart.hpp 11 Apr 2000 15:09:19 -0000 1.4
+++ AVTPart.hpp 21 Sep 2002 01:24:41 -0000 1.5
@@ -69,11 +69,7 @@
-// $$$ ToDo: This is necessary while XalanDOMString is still a typedef...
-#include <XalanDOM/XalanDOMString.hpp>
-
-
-
+class XalanDOMString;
class XalanNode;
class PrefixResolver;
class XPathExecutionContext;
1.4 +12 -4 xml-xalan/c/src/XSLT/AVTPartSimple.cpp
Index: AVTPartSimple.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/AVTPartSimple.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- AVTPartSimple.cpp 11 Apr 2000 15:09:19 -0000 1.3
+++ AVTPartSimple.cpp 21 Sep 2002 01:24:41 -0000 1.4
@@ -2,7 +2,7 @@
* The Apache Software License, Version 1.1
*
*
- * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * Copyright (c) 1999-2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -62,12 +62,20 @@
+#include "StylesheetConstructionContext.hpp"
+
+
+
/**
* Simple string part of a complex AVT.
*/
-AVTPartSimple::AVTPartSimple(const XalanDOMString& val) :
+AVTPartSimple::AVTPartSimple(
+ StylesheetConstructionContext& constructionContext,
+ const XalanDOMChar* val,
+ XalanDOMString::size_type len) :
AVTPart(),
- m_val(val)
+ m_val(constructionContext.allocateVector(val, len, false)),
+ m_len(len)
{
}
@@ -81,5 +89,5 @@
XPathExecutionContext& /* executionContext */) const
{
- append(buf, m_val);
+ append(buf, m_val, m_len);
}
1.5 +14 -4 xml-xalan/c/src/XSLT/AVTPartSimple.hpp
Index: AVTPartSimple.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/AVTPartSimple.hpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- AVTPartSimple.hpp 11 Apr 2000 15:09:19 -0000 1.4
+++ AVTPartSimple.hpp 21 Sep 2002 01:24:41 -0000 1.5
@@ -2,7 +2,7 @@
* The Apache Software License, Version 1.1
*
*
- * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * Copyright (c) 1999-2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -77,6 +77,10 @@
+class StylesheetConstructionContext;
+
+
+
/**
* Simple string part of a complex AVT.
*/
@@ -87,9 +91,13 @@
/**
* Construct a simple Attribute Value Template (AVT) part.
*
+ * @param constructionContext context when object constructed
* @param val A pure string section of an AVT
*/
- AVTPartSimple(const XalanDOMString& val);
+ AVTPartSimple(
+ StylesheetConstructionContext& constructionContext,
+ const XalanDOMChar* val,
+ XalanDOMString::size_type len);
// These methods are inherited from AVTPart ...
@@ -106,7 +114,9 @@
/**
* Simple string value;
*/
- const XalanDOMString m_val;
+ const XalanDOMChar* const m_val;
+
+ const XalanDOMString::size_type m_len;
};
1.39 +2 -2 xml-xalan/c/src/XSLT/ElemAttribute.cpp
Index: ElemAttribute.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemAttribute.cpp,v
retrieving revision 1.38
retrieving revision 1.39
diff -u -r1.38 -r1.39
--- ElemAttribute.cpp 9 Jul 2002 06:19:40 -0000 1.38
+++ ElemAttribute.cpp 21 Sep 2002 01:24:41 -0000 1.39
@@ -100,12 +100,12 @@
if(equals(aname, Constants::ATTRNAME_NAME))
{
- m_pNameAVT = new AVT(getLocator(), aname, atts.getType(i), atts.getValue(i),
+ m_pNameAVT = new AVT(getLocator(), aname, atts.getValue(i),
*this, constructionContext);
}
else if(equals(aname,Constants::ATTRNAME_NAMESPACE))
{
- m_pNamespaceAVT = new AVT(getLocator(), aname, atts.getType(i), atts.getValue(i),
+ m_pNamespaceAVT = new AVT(getLocator(), aname, atts.getValue(i),
*this, constructionContext);
}
else if(!(isAttrOK(aname, atts, i, constructionContext) ||
1.20 +9 -2 xml-xalan/c/src/XSLT/ElemAttributeSet.cpp
Index: ElemAttributeSet.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemAttributeSet.cpp,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- ElemAttributeSet.cpp 20 May 2002 17:58:58 -0000 1.19
+++ ElemAttributeSet.cpp 21 Sep 2002 01:24:41 -0000 1.20
@@ -90,7 +90,7 @@
if(equals(aname,Constants::ATTRNAME_NAME))
{
- m_QName = XalanQNameByValue(atts.getValue(i), stylesheetTree.getNamespaces());
+ m_QName.set(atts.getValue(i), stylesheetTree.getNamespaces());
stylesheetTree.addAttributeSet(this);
}
@@ -104,10 +104,17 @@
}
}
- if(isEmpty(m_QName.getLocalPart()))
+ if(m_QName.isEmpty() == true)
{
constructionContext.error(
"xsl:attribute-set must have a 'name' attribute",
+ 0,
+ this);
+ }
+ else if (isValidNCName(m_QName.getLocalPart()) == false)
+ {
+ constructionContext.error(
+ "xsl:attribute-set has an invalid 'name' attribute",
0,
this);
}
1.23 +1 -1 xml-xalan/c/src/XSLT/ElemCallTemplate.cpp
Index: ElemCallTemplate.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemCallTemplate.cpp,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -r1.22 -r1.23
--- ElemCallTemplate.cpp 23 Feb 2002 04:23:16 -0000 1.22
+++ ElemCallTemplate.cpp 21 Sep 2002 01:24:41 -0000 1.23
@@ -98,7 +98,7 @@
if(equals(aname, Constants::ATTRNAME_NAME))
{
- m_templateName = XalanQNameByValue(atts.getValue(i), getStylesheet().getNamespaces());
+ m_templateName.set(atts.getValue(i), getStylesheet().getNamespaces());
}
else if(!isAttrOK(aname, atts, i, constructionContext))
{
1.10 +1 -1 xml-xalan/c/src/XSLT/ElemDecimalFormat.cpp
Index: ElemDecimalFormat.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemDecimalFormat.cpp,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- ElemDecimalFormat.cpp 23 Feb 2002 04:23:16 -0000 1.9
+++ ElemDecimalFormat.cpp 21 Sep 2002 01:24:41 -0000 1.10
@@ -102,7 +102,7 @@
{
assert(atts.getValue(i) != 0);
- m_qname = XalanQNameByValue(atts.getValue(i), getStylesheet().getNamespaces());;
+ m_qname.set(atts.getValue(i), getStylesheet().getNamespaces());
}
else if(equals(aname, Constants::ATTRNAME_DECIMALSEPARATOR))
{
1.39 +2 -2 xml-xalan/c/src/XSLT/ElemElement.cpp
Index: ElemElement.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemElement.cpp,v
retrieving revision 1.38
retrieving revision 1.39
diff -u -r1.38 -r1.39
--- ElemElement.cpp 16 May 2002 00:48:20 -0000 1.38
+++ ElemElement.cpp 21 Sep 2002 01:24:41 -0000 1.39
@@ -100,12 +100,12 @@
if(equals(aname, Constants::ATTRNAME_NAME))
{
- m_nameAVT = new AVT(getLocator(), aname, atts.getType(i), atts.getValue(i),
+ m_nameAVT = new AVT(getLocator(), aname, atts.getValue(i),
*this, constructionContext);
}
else if(equals(aname, Constants::ATTRNAME_NAMESPACE))
{
- m_namespaceAVT = new AVT(getLocator(), aname, atts.getType(i), atts.getValue(i),
+ m_namespaceAVT = new AVT(getLocator(), aname, atts.getValue(i),
*this, constructionContext);
}
else if(!(processUseAttributeSets(constructionContext, aname, atts, i) ||
1.11 +3 -2 xml-xalan/c/src/XSLT/ElemExtensionCall.cpp
Index: ElemExtensionCall.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemExtensionCall.cpp,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- ElemExtensionCall.cpp 9 Mar 2001 16:20:03 -0000 1.10
+++ ElemExtensionCall.cpp 21 Sep 2002 01:24:41 -0000 1.11
@@ -59,6 +59,7 @@
#include "Constants.hpp"
+#include "StylesheetConstructionContext.hpp"
#include "StylesheetExecutionContext.hpp"
@@ -79,9 +80,9 @@
lineNumber,
columnNumber,
Constants::ELEMNAME_EXTENSIONCALL),
- m_name(name),
+ m_name(constructionContext.getPooledString(name)),
m_nsh(ns),
- m_localPart(localpart)
+ m_localPart(constructionContext.getPooledString(localpart))
{
}
1.11 +2 -2 xml-xalan/c/src/XSLT/ElemExtensionCall.hpp
Index: ElemExtensionCall.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemExtensionCall.hpp,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- ElemExtensionCall.hpp 9 Mar 2001 16:20:03 -0000 1.10
+++ ElemExtensionCall.hpp 21 Sep 2002 01:24:41 -0000 1.11
@@ -112,11 +112,11 @@
private:
- const XalanDOMString m_name;
+ const XalanDOMString& m_name;
ExtensionNSHandler& m_nsh;
- const XalanDOMString m_localPart;
+ const XalanDOMString& m_localPart;
};
1.19 +2 -1 xml-xalan/c/src/XSLT/ElemIf.cpp
Index: ElemIf.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemIf.cpp,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -r1.18 -r1.19
--- ElemIf.cpp 6 Sep 2002 01:39:17 -0000 1.18
+++ ElemIf.cpp 21 Sep 2002 01:24:41 -0000 1.19
@@ -107,7 +107,8 @@
{
processSpaceAttr(atts, i, constructionContext);
}
- else if (!isAttrOK(aname, atts, i, constructionContext))
+ else if (!processSpaceAttr(aname, atts, i, constructionContext) ||
+ !isAttrOK(aname, atts, i, constructionContext))
{
constructionContext.error(
"xsl:if has an illegal attribute",
1.53 +4 -44 xml-xalan/c/src/XSLT/ElemLiteralResult.cpp
Index: ElemLiteralResult.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemLiteralResult.cpp,v
retrieving revision 1.52
retrieving revision 1.53
diff -u -r1.52 -r1.53
--- ElemLiteralResult.cpp 6 Sep 2002 01:39:17 -0000 1.52
+++ ElemLiteralResult.cpp 21 Sep 2002 01:24:41 -0000 1.53
@@ -99,7 +99,7 @@
lineNumber,
columnNumber,
xslToken),
- m_elementName(name),
+ m_elementName(constructionContext.getPooledString(name)),
m_avts(),
m_attrCount(0),
m_hasPrefix(indexOf(name, XalanUnicode::charColon) < length(name) ? true : false)
@@ -166,7 +166,7 @@
if(! processUseAttributeSets(constructionContext, aname, atts, i) &&
isAttrOK(aname, atts, i, constructionContext))
{
- m_avts.push_back(new AVT(getLocator(), aname, atts.getType(i), atts.getValue(i),
+ m_avts.push_back(new AVT(getLocator(), aname, atts.getValue(i),
*this, constructionContext));
}
}
@@ -267,25 +267,6 @@
-inline void
-ElemLiteralResult::doAddResultAttribute(
- StylesheetExecutionContext& executionContext,
- const XalanDOMString& thePrefix,
- const XalanDOMString& theName,
- const XalanDOMString& theValue) const
-{
- if (isEmpty(thePrefix) == true ||
- shouldExcludeResultNamespaceNode(
- theValue) == false)
- {
- executionContext.addResultAttribute(
- theName,
- theValue);
- }
-}
-
-
-
void
ElemLiteralResult::execute(StylesheetExecutionContext& executionContext) const
{
@@ -333,20 +314,9 @@
const XalanDOMString& theName = avt->getName();
- const XalanDOMString& thePrefix = avt->getPrefix();
-
- const XalanDOMString& theSimpleValue = avt->getSimpleValue();
+ avt->evaluate(theStringedValue, executionContext.getCurrentNode(), *this, executionContext);
- if (isEmpty(theSimpleValue) == false)
- {
- doAddResultAttribute(executionContext, thePrefix, theName, theSimpleValue);
- }
- else
- {
- avt->evaluate(theStringedValue, executionContext.getCurrentNode(), *this, executionContext);
-
- doAddResultAttribute(executionContext, thePrefix, theName, theStringedValue);
- }
+ executionContext.addResultAttribute(theName, theStringedValue);
}
}
@@ -417,14 +387,4 @@
{
return false;
}
-}
-
-
-
-bool
-ElemLiteralResult::shouldExcludeResultNamespaceNode(const XalanDOMString& theURI) const
-{
- return m_namespacesHandler.shouldExcludeResultNamespaceNode(
- getStylesheet().getXSLTNamespaceURI(),
- theURI);
}
1.27 +1 -24 xml-xalan/c/src/XSLT/ElemLiteralResult.hpp
Index: ElemLiteralResult.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemLiteralResult.hpp,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -r1.26 -r1.27
--- ElemLiteralResult.hpp 6 Sep 2002 01:39:17 -0000 1.26
+++ ElemLiteralResult.hpp 21 Sep 2002 01:24:41 -0000 1.27
@@ -150,32 +150,9 @@
const XalanDOMChar* attrValue);
/**
- * Determine if the namespace node should be excluded.
- *
- * @param theURI The namespace URI.
- */
- bool
- shouldExcludeResultNamespaceNode(const XalanDOMString& theURI) const;
-
- /**
- * Add a result attribute, if necessary.
- *
- * @param executionContext The current execution context
- * @param thePrefix The prefix of the attribute
- * @param theName The name of the attribute.
- * @param theValue The value of the attribute.
- */
- void
- doAddResultAttribute(
- StylesheetExecutionContext& executionContext,
- const XalanDOMString& thePrefix,
- const XalanDOMString& theName,
- const XalanDOMString& theValue) const;
-
- /**
* The name of the literal result element.
*/
- const XalanDOMString m_elementName;
+ const XalanDOMString& m_elementName;
/**
* A vector to keep track of the attribute elements.
1.63 +5 -5 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.62
retrieving revision 1.63
diff -u -r1.62 -r1.63
--- ElemNumber.cpp 9 Sep 2002 18:39:49 -0000 1.62
+++ ElemNumber.cpp 21 Sep 2002 01:24:41 -0000 1.63
@@ -168,27 +168,27 @@
}
else if(equals(aname, Constants::ATTRNAME_FORMAT))
{
- m_format_avt = new AVT(getLocator(), aname, atts.getType(i),
+ m_format_avt = new AVT(getLocator(), aname,
atts.getValue(i), *this, constructionContext);
}
else if(equals(aname, Constants::ATTRNAME_LANG))
{
- m_lang_avt = new AVT(getLocator(), aname, atts.getType(i),
+ m_lang_avt = new AVT(getLocator(), aname,
atts.getValue(i), *this, constructionContext);
}
else if(equals(aname, Constants::ATTRNAME_LETTERVALUE))
{
- m_lettervalue_avt = new AVT(getLocator(), aname, atts.getType(i),
+ m_lettervalue_avt = new AVT(getLocator(), aname,
atts.getValue(i), *this, constructionContext);
}
else if(equals(aname,Constants::ATTRNAME_GROUPINGSEPARATOR))
{
- m_groupingSeparator_avt = new AVT(getLocator(), aname, atts.getType(i),
+ m_groupingSeparator_avt = new AVT(getLocator(), aname,
atts.getValue(i), *this, constructionContext);
}
else if(equals(aname,Constants::ATTRNAME_GROUPINGSIZE))
{
- m_groupingSize_avt = new AVT(getLocator(), aname, atts.getType(i),
+ m_groupingSize_avt = new AVT(getLocator(), aname,
atts.getValue(i), *this, constructionContext);
}
else if(!isAttrOK(aname, atts, i, constructionContext))
1.22 +1 -1 xml-xalan/c/src/XSLT/ElemPI.cpp
Index: ElemPI.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemPI.cpp,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -r1.21 -r1.22
--- ElemPI.cpp 9 Jul 2002 06:19:40 -0000 1.21
+++ ElemPI.cpp 21 Sep 2002 01:24:41 -0000 1.22
@@ -93,7 +93,7 @@
if(equals(aname, Constants::ATTRNAME_NAME))
{
- m_nameAVT = new AVT(getLocator(), aname, atts.getType(i), atts.getValue(i),
+ m_nameAVT = new AVT(getLocator(), aname, atts.getValue(i),
*this, constructionContext);
}
else if(isAttrOK(aname, atts, i, constructionContext) == false ||
1.14 +6 -6 xml-xalan/c/src/XSLT/ElemSort.cpp
Index: ElemSort.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemSort.cpp,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- ElemSort.cpp 29 May 2002 18:21:52 -0000 1.13
+++ ElemSort.cpp 21 Sep 2002 01:24:41 -0000 1.14
@@ -101,22 +101,22 @@
}
else if(equals(aname, Constants::ATTRNAME_LANG))
{
- m_langAVT = new AVT(getLocator(), aname, atts.getType(i), atts.getValue(i),
+ m_langAVT = new AVT(getLocator(), aname, atts.getValue(i),
*this, constructionContext);
}
else if(equals(aname, Constants::ATTRNAME_DATATYPE))
{
- m_dataTypeAVT = new AVT(getLocator(), aname, atts.getType(i), atts.getValue(i),
+ m_dataTypeAVT = new AVT(getLocator(), aname, atts.getValue(i),
*this, constructionContext);
}
else if(equals(aname, Constants::ATTRNAME_ORDER))
{
- m_orderAVT = new AVT(getLocator(), aname, atts.getType(i), atts.getValue(i),
+ m_orderAVT = new AVT(getLocator(), aname, atts.getValue(i),
*this, constructionContext);
}
else if(equals(aname, Constants::ATTRNAME_CASEORDER))
{
- m_caseOrderAVT = new AVT(getLocator(), aname, atts.getType(i), atts.getValue(i),
+ m_caseOrderAVT = new AVT(getLocator(), aname, atts.getValue(i),
*this, constructionContext);
}
else if(!isAttrOK(aname, atts, i, constructionContext))
@@ -130,13 +130,13 @@
if(0 == m_dataTypeAVT)
{
- m_dataTypeAVT = new AVT(getLocator(), c_wstr(Constants::ATTRNAME_DATATYPE), c_wstr(Constants::ATTRTYPE_CDATA), c_wstr(Constants::ATTRVAL_DATATYPE_TEXT),
+ m_dataTypeAVT = new AVT(getLocator(), c_wstr(Constants::ATTRNAME_DATATYPE), c_wstr(Constants::ATTRVAL_DATATYPE_TEXT),
*this, constructionContext);
}
if(0 == m_orderAVT)
{
- m_orderAVT = new AVT(getLocator(), c_wstr(Constants::ATTRNAME_ORDER), c_wstr(Constants::ATTRTYPE_CDATA), c_wstr(Constants::ATTRVAL_ORDER_ASCENDING),
+ m_orderAVT = new AVT(getLocator(), c_wstr(Constants::ATTRNAME_ORDER), c_wstr(Constants::ATTRVAL_ORDER_ASCENDING),
*this, constructionContext);
}
1.77 +23 -22 xml-xalan/c/src/XSLT/ElemTemplateElement.cpp
Index: ElemTemplateElement.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemTemplateElement.cpp,v
retrieving revision 1.76
retrieving revision 1.77
diff -u -r1.76 -r1.77
--- ElemTemplateElement.cpp 6 Sep 2002 01:39:18 -0000 1.76
+++ ElemTemplateElement.cpp 21 Sep 2002 01:24:41 -0000 1.77
@@ -97,6 +97,7 @@
#include "ElemCallTemplate.hpp"
#include "ElemForEach.hpp"
#include "ElemTemplate.hpp"
+#include "ElemTextLiteral.hpp"
#include "NamespacesHandler.hpp"
#include "NodeSorter.hpp"
#include "Stylesheet.hpp"
@@ -115,7 +116,7 @@
ElemTemplateElement::ElemTemplateElement(
- StylesheetConstructionContext& /* constructionContext */,
+ StylesheetConstructionContext& constructionContext,
Stylesheet& stylesheetTree,
int lineNumber,
int columnNumber,
@@ -136,7 +137,7 @@
m_previousSibling(0),
m_firstChild(0),
m_surrogateChildren(*this),
- m_baseIndentifier(stylesheetTree.getCurrentIncludeBaseIdentifier()),
+ m_baseIndentifier(constructionContext.getPooledString(stylesheetTree.getCurrentIncludeBaseIdentifier())),
m_optimizationFlags(eCanGenerateAttributes),
m_locatorProxy(*this)
{
@@ -358,16 +359,16 @@
{
if (hasSingleTextChild() == true)
{
- assert(m_firstChild != 0);
+ assert(m_textLiteralChild != 0);
- return m_firstChild->getNodeValue();
+ assign(result, m_textLiteralChild->getText(), m_textLiteralChild->getLength());
}
else
{
doChildrenToString(executionContext, result);
-
- return result;
}
+
+ return result;
}
@@ -379,19 +380,19 @@
{
if (hasSingleTextChild() == true)
{
- assert(m_firstChild != 0);
-
executionContext.addResultAttribute(
- theName,
- m_firstChild->getNodeValue());
+ theName,
+ m_textLiteralChild->getText());
}
else
{
StylesheetExecutionContext::GetAndReleaseCachedString theResult(executionContext);
+ childrenToString(executionContext, theResult.get());
+
executionContext.addResultAttribute(
- theName,
- doChildrenToString(executionContext, theResult.get()));
+ theName,
+ theResult.get());
}
}
@@ -402,15 +403,15 @@
{
if (hasSingleTextChild() == true)
{
- assert(m_firstChild != 0);
-
- executionContext.comment(c_wstr(m_firstChild->getNodeValue()));
+ executionContext.comment(m_textLiteralChild->getText());
}
else
{
StylesheetExecutionContext::GetAndReleaseCachedString theResult(executionContext);
- executionContext.comment(c_wstr(doChildrenToString(executionContext, theResult.get())));
+ childrenToString(executionContext, theResult.get());
+
+ executionContext.comment(c_wstr(theResult.get()));
}
}
@@ -423,19 +424,19 @@
{
if (hasSingleTextChild() == true)
{
- assert(m_firstChild != 0);
-
executionContext.processingInstruction(
- c_wstr(theTarget),
- c_wstr(m_firstChild->getNodeValue()));
+ c_wstr(theTarget),
+ m_textLiteralChild->getText());
}
else
{
StylesheetExecutionContext::GetAndReleaseCachedString theResult(executionContext);
+ childrenToString(executionContext, theResult.get());
+
executionContext.processingInstruction(
- c_wstr(theTarget),
- c_wstr(doChildrenToString(executionContext, theResult.get())));
+ c_wstr(theTarget),
+ c_wstr(theResult.get()));
}
}
1.46 +3 -1 xml-xalan/c/src/XSLT/ElemTemplateElement.hpp
Index: ElemTemplateElement.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemTemplateElement.hpp,v
retrieving revision 1.45
retrieving revision 1.46
diff -u -r1.45 -r1.46
--- ElemTemplateElement.hpp 6 Sep 2002 01:39:18 -0000 1.45
+++ ElemTemplateElement.hpp 21 Sep 2002 01:24:41 -0000 1.46
@@ -88,6 +88,7 @@
class AttributeList;
class ElemTemplate;
+class ElemTextLiteral;
class NamespacesHandler;
class Stylesheet;
class StylesheetConstructionContext;
@@ -818,11 +819,12 @@
{
ElemTemplateElement* m_firstChild;
const ElemTemplate* m_directTemplate;
+ const ElemTextLiteral* m_textLiteralChild;
};
XalanNodeListSurrogate m_surrogateChildren;
- const XalanDOMString m_baseIndentifier;
+ const XalanDOMString& m_baseIndentifier;
enum { eHasParams = 1,
eHasSingleTextChild = 2,
1.17 +6 -11 xml-xalan/c/src/XSLT/ElemTextLiteral.cpp
Index: ElemTextLiteral.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemTextLiteral.cpp,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- ElemTextLiteral.cpp 14 May 2002 15:46:30 -0000 1.16
+++ ElemTextLiteral.cpp 21 Sep 2002 01:24:41 -0000 1.17
@@ -67,6 +67,7 @@
#include "Constants.hpp"
+#include "StylesheetConstructionContext.hpp"
#include "StylesheetExecutionContext.hpp"
@@ -91,7 +92,9 @@
m_preserveSpace(preserveSpace),
m_disableOutputEscaping(disableOutputEscaping),
m_isWhitespace(isXMLWhitespace(ch, start, length)),
- m_ch(ch + start, length)
+ // Always null-terminate our buffer, since we may need it that way.
+ m_ch(constructionContext.allocateVector(ch + start, length, true)),
+ m_length(length)
{
}
@@ -104,14 +107,6 @@
const XalanDOMString&
-ElemTextLiteral::getNodeValue() const
-{
- return m_ch;
-}
-
-
-
-const XalanDOMString&
ElemTextLiteral::getElementName() const
{
return Constants::ELEMNAME_TEXT_WITH_PREFIX_STRING;
@@ -134,10 +129,10 @@
if(!m_disableOutputEscaping)
{
- executionContext.characters(toCharArray(m_ch), 0, length(m_ch));
+ executionContext.characters(m_ch, 0, m_length);
}
else
{
- executionContext.charactersRaw(toCharArray(m_ch), 0, length(m_ch));
+ executionContext.charactersRaw(m_ch, 0, m_length);
}
}
1.15 +9 -5 xml-xalan/c/src/XSLT/ElemTextLiteral.hpp
Index: ElemTextLiteral.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemTextLiteral.hpp,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- ElemTextLiteral.hpp 14 May 2002 15:46:30 -0000 1.14
+++ ElemTextLiteral.hpp 21 Sep 2002 01:24:41 -0000 1.15
@@ -116,21 +116,24 @@
return m_preserveSpace;
}
- const XalanDOMString&
+ const XalanDOMChar*
getText() const
{
return m_ch;
}
+ const XalanDOMString::size_type
+ getLength() const
+ {
+ return m_length;
+ }
+
virtual bool
isWhitespace() const;
// These methods are inherited from ElemTemplateElement ...
virtual const XalanDOMString&
- getNodeValue() const;
-
- virtual const XalanDOMString&
getElementName() const;
virtual void
@@ -149,7 +152,8 @@
const bool m_disableOutputEscaping;
const bool m_isWhitespace;
- const XalanDOMString m_ch;
+ const XalanDOMChar* const m_ch;
+ const XalanDOMString::size_type m_length;
};
1.23 +69 -45 xml-xalan/c/src/XSLT/FunctionKey.cpp
Index: FunctionKey.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/FunctionKey.cpp,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -r1.22 -r1.23
--- FunctionKey.cpp 26 Sep 2001 21:30:23 -0000 1.22
+++ FunctionKey.cpp 21 Sep 2002 01:24:41 -0000 1.23
@@ -2,7 +2,7 @@
* The Apache Software License, Version 1.1
*
*
- * Copyright (c) 2000 The Apache Software Foundation. All rights
+ * Copyright (c) 2000-2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -78,6 +78,7 @@
#include <XPath/MutableNodeRefList.hpp>
#include <XPath/NodeRefListBase.hpp>
+#include <XPath/XalanQNameByReference.hpp>
#include <XPath/XObjectFactory.hpp>
@@ -101,10 +102,44 @@
+inline void
+getNodeSet(
+ XPathExecutionContext& executionContext,
+ XalanDocument* document,
+ const XalanDOMString& keyname,
+ const XalanDOMString& ref,
+ const Locator* locator,
+ MutableNodeRefList& theNodeRefList)
+{
+ assert(document != 0);
+
+ if (indexOf(keyname, XalanUnicode::charColon) < length(keyname))
+ {
+ executionContext.getNodeSetByKey(
+ document,
+ keyname,
+ ref,
+ locator,
+ theNodeRefList);
+ }
+ else
+ {
+ const XalanQNameByReference theQName(keyname);
+
+ executionContext.getNodeSetByKey(
+ document,
+ theQName,
+ ref,
+ theNodeRefList);
+ }
+}
+
+
+
XObjectPtr
FunctionKey::execute(
XPathExecutionContext& executionContext,
- XalanNode* context,
+ XalanNode* context,
const XObjectPtr arg1,
const XObjectPtr arg2,
const Locator* locator) const
@@ -131,45 +166,49 @@
#endif
context->getOwnerDocument();
- if(0 == docContext)
- {
- executionContext.error(
- "Context does not have an owner document!",
- context,
- locator);
- }
-
+ assert(docContext != 0);
assert(executionContext.getPrefixResolver() != 0);
const XalanDOMString& keyname = arg1->str();
assert(arg2.null() == false);
- const bool argIsNodeSet =
- XObject::eTypeNodeSet == arg2->getType() ? true : false;
-
typedef XPathExecutionContext::BorrowReturnMutableNodeRefList BorrowReturnMutableNodeRefList;
// This list will hold the nodes...
BorrowReturnMutableNodeRefList theNodeRefList(executionContext);
- if(argIsNodeSet == true)
+ if(arg2->getType() != XObject::eTypeNodeSet)
+ {
+ getNodeSet(
+ executionContext,
+ docContext,
+ keyname,
+ arg2->str(),
+ locator,
+ *theNodeRefList.get());
+ }
+ else
{
const NodeRefListBase& theNodeSet = arg2->nodeset();
const NodeRefListBase::size_type nRefs = theNodeSet.getLength();
- if (nRefs > 0)
+ if (nRefs == 1)
{
-#if defined(XALAN_NO_NAMESPACES)
- typedef set<XalanDOMString, less<XalanDOMString> > StringSetType;
-#else
- typedef std::set<XalanDOMString> StringSetType;
-#endif
-
- StringSetType usedrefs;
+ getNodeSet(
+ executionContext,
+ docContext,
+ keyname,
+ arg2->str(),
+ locator,
+ *theNodeRefList.get());
+ }
+ else if (nRefs > 1)
+ {
+ XPathExecutionContext::GetAndReleaseCachedString theResult(executionContext);
- XalanDOMString ref;
+ XalanDOMString& ref = theResult.get();
for(NodeRefListBase::size_type i = 0; i < nRefs; i++)
{
@@ -179,33 +218,18 @@
if(0 != length(ref))
{
- // Make sure we haven't already processed it...
- if(usedrefs.find(ref) == usedrefs.end())
- {
- usedrefs.insert(ref);
-
- executionContext.getNodeSetByKey(
- docContext,
- keyname,
- ref,
- *executionContext.getPrefixResolver(),
- *theNodeRefList.get());
- }
+ getNodeSet(
+ executionContext,
+ docContext,
+ keyname,
+ ref,
+ locator,
+ *theNodeRefList.get());
}
clear(ref);
}
}
- }
- else
- {
- const XalanDOMString& ref = arg2->str();
-
- executionContext.getNodeSetByKey(docContext,
- keyname,
- ref,
- *executionContext.getPrefixResolver(),
- *theNodeRefList.get());
}
return executionContext.getXObjectFactory().createNodeSet(theNodeRefList);
1.19 +0 -2 xml-xalan/c/src/XSLT/KeyTable.cpp
Index: KeyTable.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/KeyTable.cpp,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -r1.18 -r1.19
--- KeyTable.cpp 19 Dec 2001 22:06:51 -0000 1.18
+++ KeyTable.cpp 21 Sep 2002 01:24:41 -0000 1.19
@@ -89,12 +89,10 @@
KeyTable::KeyTable(
- XalanNode* doc,
XalanNode* startNode,
const PrefixResolver& resolver,
const KeyDeclarationVectorType& keyDeclarations,
StylesheetExecutionContext& executionContext) :
- m_docKey(doc),
m_keys()
{
XalanNode* pos = startNode;
1.13 +3 -18 xml-xalan/c/src/XSLT/KeyTable.hpp
Index: KeyTable.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/KeyTable.hpp,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- KeyTable.hpp 20 Dec 2001 00:24:53 -0000 1.12
+++ KeyTable.hpp 21 Sep 2002 01:24:41 -0000 1.13
@@ -62,7 +62,6 @@
*
* $State$
*
- * @author Myriam Midy (Myriam_Midy @lotus.com
*/
@@ -91,6 +90,7 @@
class PrefixResolver;
class StylesheetExecutionContext;
class XalanElement;
+class XalanDocument;
class XalanNode;
@@ -130,8 +130,6 @@
/**
* Build a keys table.
*
- * @param doc owner document key (normally the same as
- * startNode)
* @param startNode node to start iterating from to build the keys
* index
* @param nscontext stylesheet's namespace context
@@ -139,7 +137,6 @@
* @param executionContext current execution context
*/
KeyTable(
- XalanNode* doc,
XalanNode* startNode,
const PrefixResolver& resolver,
const KeyDeclarationVectorType& keyDeclarations,
@@ -165,18 +162,6 @@
const XalanQName& qname,
const XalanDOMString& ref) const;
- /**
- * Retrieve the document key. This table should only be used with contexts
- * whose Document root matches this key.
- *
- * @return Node for document
- */
- const XalanNode*
- getDocKey() const
- {
- return m_docKey;
- }
-
private:
/**
@@ -202,7 +187,7 @@
* The document key. This table should only be used with contexts
* whose Document roots match this key.
*/
- const XalanNode* m_docKey;
+ const XalanDocument* m_docKey;
/**
* Table of element keys. The table will be built on demand,
1.8 +12 -22 xml-xalan/c/src/XSLT/ResultNamespacesStack.cpp
Index: ResultNamespacesStack.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/ResultNamespacesStack.cpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- ResultNamespacesStack.cpp 16 May 2002 00:47:55 -0000 1.7
+++ ResultNamespacesStack.cpp 21 Sep 2002 01:24:41 -0000 1.8
@@ -76,9 +76,11 @@
void
ResultNamespacesStack::addDeclaration(
- const XalanDOMString& thePrefix,
- const XalanDOMString& theNamespaceURI)
+ const XalanDOMString& thePrefix,
+ const XalanDOMChar* theNamespaceURI,
+ XalanDOMString::size_type theLength)
{
+ assert(theNamespaceURI != 0);
assert(m_createNewContextStack.size() != 0);
// Check to see if we need to create a new context and do so if necessary...
@@ -91,8 +93,14 @@
NamespaceVectorType& theCurrentNamespaces = m_resultNamespaces.back();
- // Add the namespace at the end of the current namespaces.
- theCurrentNamespaces.push_back(NameSpace(thePrefix, theNamespaceURI));
+ // Add a new namespace at the end of the current namespaces.
+ theCurrentNamespaces.resize(theCurrentNamespaces.size() + 1);
+
+ NameSpace& theNewNamespace = theCurrentNamespaces.back();
+
+ theNewNamespace.setPrefix(thePrefix);
+
+ theNewNamespace.setURI(theNamespaceURI, theLength);
}
@@ -123,24 +131,6 @@
}
m_createNewContextStack.pop_back();
-}
-
-
-
-const XalanDOMString*
-ResultNamespacesStack::getNamespaceForPrefix(const XalanDOMString& thePrefix) const
-{
- // Search vector from first element back
- return XalanQName::getNamespaceForPrefix(m_resultNamespaces, thePrefix, true);
-}
-
-
-
-const XalanDOMString*
-ResultNamespacesStack::getPrefixForNamespace(const XalanDOMString& theNamespaceURI) const
-{
- // Search vector from first element back
- return XalanQName::getPrefixForNamespace(m_resultNamespaces, theNamespaceURI, true);
}
1.7 +34 -3 xml-xalan/c/src/XSLT/ResultNamespacesStack.hpp
Index: ResultNamespacesStack.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/ResultNamespacesStack.hpp,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- ResultNamespacesStack.hpp 24 Jul 2002 23:18:02 -0000 1.6
+++ ResultNamespacesStack.hpp 21 Sep 2002 01:24:41 -0000 1.7
@@ -100,7 +100,30 @@
void
addDeclaration(
const XalanDOMString& thePrefix,
- const XalanDOMString& theNamespaceURI);
+ const XalanDOMString& theNamespaceURI)
+ {
+ addDeclaration(
+ thePrefix,
+ theNamespaceURI.c_str(),
+ theNamespaceURI.length());
+ }
+
+ void
+ addDeclaration(
+ const XalanDOMString& thePrefix,
+ const XalanDOMChar* theNamespaceURI)
+ {
+ addDeclaration(
+ thePrefix,
+ theNamespaceURI,
+ length(theNamespaceURI));
+ }
+
+ void
+ addDeclaration(
+ const XalanDOMString& thePrefix,
+ const XalanDOMChar* theNamespaceURI,
+ XalanDOMString::size_type theLength);
void
pushContext();
@@ -109,10 +132,18 @@
popContext();
const XalanDOMString*
- getNamespaceForPrefix(const XalanDOMString& thePrefix) const;
+ getNamespaceForPrefix(const XalanDOMString& thePrefix) const
+ {
+ // Search vector from first element back
+ return XalanQName::getNamespaceForPrefix(m_resultNamespaces, thePrefix, true);
+ }
const XalanDOMString*
- getPrefixForNamespace(const XalanDOMString& theNamespaceURI) const;
+ getPrefixForNamespace(const XalanDOMString& theNamespaceURI) const
+ {
+ // Search vector from first element back
+ return XalanQName::getPrefixForNamespace(m_resultNamespaces, theNamespaceURI, true);
+ }
/**
1.14 +49 -0 xml-xalan/c/src/XSLT/StylesheetConstructionContext.hpp
Index: StylesheetConstructionContext.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetConstructionContext.hpp,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- StylesheetConstructionContext.hpp 6 Sep 2002 01:39:18 -0000 1.13
+++ StylesheetConstructionContext.hpp 21 Sep 2002 01:24:41 -0000 1.14
@@ -338,6 +338,55 @@
virtual double
getXSLTVersionSupported() const = 0;
+ /**
+ * Get a pooled string given the source string. If
+ * the string already exists in the pool, no copy
+ * will be made. If not, a copy will be made and
+ * kept for later use.
+ *
+ * @param theString The source string
+ * @return a const reference to a pooled string.
+ */
+ virtual const XalanDOMString&
+ getPooledString(const XalanDOMString& theString) = 0;
+
+ /**
+ * Get a pooled string given the source character
+ * array. If the string already exists in the pool,
+ * no copy will be made. If not, a copy will be made
+ * and kept for later use.
+ *
+ * @param theString The source character array
+ * @param theLength The length of the character array
+ * @return a const reference to a pooled string.
+ */
+ virtual const XalanDOMString&
+ getPooledString(
+ const XalanDOMChar* theString,
+ XalanDOMString::size_type theLength = XalanDOMString::npos) = 0;
+
+ /**
+ * Allocate a vector of XalanDOMChar of the specified
+ * size.
+ *
+ * @param theLength The length of the character vector
+ */
+ virtual XalanDOMChar*
+ allocateVector(XalanDOMString::size_type theLength) = 0;
+
+ /**
+ * Allocate a vector of XalanDOMChar of the specified
+ * size.
+ *
+ * @param theString The source character array
+ * @param theLength The length of the character vector
+ * @param fTerminate If true, terminate the new vector with 0
+ */
+ virtual XalanDOMChar*
+ allocateVector(
+ const XalanDOMChar* theString,
+ XalanDOMString::size_type theLength = XalanDOMString::npos,
+ bool fTerminate = true) = 0;
// These interfaces are inherited from ExecutionContext...
1.20 +62 -17 xml-xalan/c/src/XSLT/StylesheetConstructionContextDefault.cpp
Index: StylesheetConstructionContextDefault.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetConstructionContextDefault.cpp,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- StylesheetConstructionContextDefault.cpp 6 Sep 2002 01:39:18 -0000 1.19
+++ StylesheetConstructionContextDefault.cpp 21 Sep 2002 01:24:41 -0000 1.20
@@ -88,28 +88,16 @@
StylesheetConstructionContextDefault::StylesheetConstructionContextDefault(
- XSLTEngineImpl& processor,
- XPathEnvSupport& /* xpathEnvSupport */,
- XPathFactory& xpathFactory) :
- StylesheetConstructionContext(),
- m_processor(processor),
- m_xpathFactory(xpathFactory),
- m_xpathProcessor(new XPathProcessorImpl),
- m_stylesheets(),
- m_tempBuffer()
-{
-}
-
-
-
-StylesheetConstructionContextDefault::StylesheetConstructionContextDefault(
- XSLTEngineImpl& processor,
- XPathFactory& xpathFactory) :
+ XSLTEngineImpl& processor,
+ XPathFactory& xpathFactory,
+ VectorAllocatorSizeType theAllocatorSize) :
StylesheetConstructionContext(),
m_processor(processor),
m_xpathFactory(xpathFactory),
m_xpathProcessor(new XPathProcessorImpl),
m_stylesheets(),
+ m_stringPool(),
+ m_xalanDOMCharVectorAllocator(theAllocatorSize),
m_tempBuffer()
{
}
@@ -539,4 +527,61 @@
StylesheetConstructionContextDefault::getXSLTVersionSupported() const
{
return XSLTEngineImpl::getXSLTVerSupported();
+}
+
+
+
+const XalanDOMString&
+StylesheetConstructionContextDefault::getPooledString(const XalanDOMString& theString)
+{
+ return m_stringPool.get(theString);
+}
+
+
+
+const XalanDOMString&
+StylesheetConstructionContextDefault::getPooledString(
+ const XalanDOMChar* theString,
+ XalanDOMString::size_type theLength)
+{
+ return m_stringPool.get(theString, theLength);
+}
+
+
+
+XalanDOMChar*
+StylesheetConstructionContextDefault::allocateVector(XalanDOMString::size_type theLength)
+{
+ return m_xalanDOMCharVectorAllocator.allocate(theLength);
+}
+
+
+
+XalanDOMChar*
+StylesheetConstructionContextDefault::allocateVector(
+ const XalanDOMChar* theString,
+ XalanDOMString::size_type theLength,
+ bool fTerminate)
+{
+ assert(theString != 0);
+
+ const XalanDOMString::size_type theActualLength =
+ theLength == XalanDOMString::npos ? XalanDOMString::length(theString) : theLength;
+
+ XalanDOMChar* const theVector =
+ m_xalanDOMCharVectorAllocator.allocate(fTerminate == true ? theActualLength + 1 : theActualLength);
+
+#if !defined(XALAN_NO_NAMESPACES)
+ using std::copy;
+#endif
+
+ XalanDOMChar* const theEnd =
+ std::copy(theString, theString + theActualLength, theVector);
+
+ if (fTerminate == true)
+ {
+ *theEnd = XalanDOMChar(0);
+ }
+
+ return theVector;
}
1.22 +35 -21 xml-xalan/c/src/XSLT/StylesheetConstructionContextDefault.hpp
Index: StylesheetConstructionContextDefault.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetConstructionContextDefault.hpp,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -r1.21 -r1.22
--- StylesheetConstructionContextDefault.hpp 6 Sep 2002 01:39:18 -0000 1.21
+++ StylesheetConstructionContextDefault.hpp 21 Sep 2002 01:24:41 -0000 1.22
@@ -66,6 +66,11 @@
+#include <PlatformSupport/XalanArrayAllocator.hpp>
+#include <PlatformSupport/XalanDOMStringPool.hpp>
+
+
+
#if defined(XALAN_AUTO_PTR_REQUIRES_DEFINITION) || (XALAN_ALLINONE_BUILD_DLL)
#include <XPath/XPathProcessor.hpp>
#endif
@@ -103,24 +108,11 @@
{
public:
- /*
- * Construct an instance. If the stylesheet(s) constructed is/are meant to be reused (a.k.a. "compiled"),
- * the XObjectFactory and XPathFactory instance must exist for the lifetime of the construction context
- * and, therefore, for the lifetime of the stylesheet(s). Otherwise, XObject and XPath instance will be
- * destroyed when the corresponding factories are destryed, leaving pointers to destroyed objects in the.
- * stylesheet(s).
- *
- * @deprecated This constructor is deprecated.
- *
- * @param processor a reference to an XSLTEngineImpl instance. Used for error reporting.
- * @param xpathEnvSupport a reference to an XPathEnvSupport instance.
- * @param xpathFactory a reference to an XPathFactory instance. See comments above for important details.
- *
- */
- StylesheetConstructionContextDefault(
- XSLTEngineImpl& processor,
- XPathEnvSupport& xpathEnvSupport,
- XPathFactory& xpathFactory);
+ typedef XalanArrayAllocator<XalanDOMChar> XalanDOMCharVectorAllocatorType;
+ typedef XalanDOMCharVectorAllocatorType::size_type VectorAllocatorSizeType;
+
+ // Default size for vector allocation.
+ enum { eDefaultBlockSize = 1024 };
/*
* Construct an instance. If the stylesheet(s) constructed is/are meant to be reused (a.k.a. "compiled"),
@@ -131,11 +123,12 @@
*
* @param processor a reference to an XSLTEngineImpl instance. Used for error reporting.
* @param xpathFactory a reference to an XPathFactory instance. See comments above for important details.
- *
+ * @param theAllocatorSize The block size to use for allocating vectors of XalanDOMChars
*/
StylesheetConstructionContextDefault(
- XSLTEngineImpl& processor,
- XPathFactory& xpathFactory);
+ XSLTEngineImpl& processor,
+ XPathFactory& xpathFactory,
+ VectorAllocatorSizeType theAllocatorSize = eDefaultBlockSize);
virtual
~StylesheetConstructionContextDefault();
@@ -300,6 +293,23 @@
virtual double
getXSLTVersionSupported() const;
+ virtual const XalanDOMString&
+ getPooledString(const XalanDOMString& theString);
+
+ virtual const XalanDOMString&
+ getPooledString(
+ const XalanDOMChar* theString,
+ XalanDOMString::size_type theLength = XalanDOMString::npos);
+
+ virtual XalanDOMChar*
+ allocateVector(XalanDOMString::size_type theLength);
+
+ virtual XalanDOMChar*
+ allocateVector(
+ const XalanDOMChar* theString,
+ XalanDOMString::size_type theLength = XalanDOMString::npos,
+ bool fTerminate = true);
+
#if defined(XALAN_NO_NAMESPACES)
typedef set<StylesheetRoot*,
less<StylesheetRoot*> > StylesheetSetType;
@@ -318,6 +328,10 @@
XPathProcessAutoPtr m_xpathProcessor;
StylesheetSetType m_stylesheets;
+
+ XalanDOMStringPool m_stringPool;
+
+ XalanDOMCharVectorAllocatorType m_xalanDOMCharVectorAllocator;
mutable XalanDOMString m_tempBuffer;
};
1.78 +20 -6 xml-xalan/c/src/XSLT/StylesheetExecutionContext.hpp
Index: StylesheetExecutionContext.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetExecutionContext.hpp,v
retrieving revision 1.77
retrieving revision 1.78
diff -u -r1.77 -r1.78
--- StylesheetExecutionContext.hpp 13 Aug 2002 05:56:04 -0000 1.77
+++ StylesheetExecutionContext.hpp 21 Sep 2002 01:24:41 -0000 1.78
@@ -447,6 +447,17 @@
const XalanDOMString& value) = 0;
/**
+ * Add a result attribute to the list of pending attributes.
+ *
+ * @param aname name of attribute
+ * @param value value of attribute
+ */
+ virtual void
+ addResultAttribute(
+ const XalanDOMString& aname,
+ const XalanDOMChar* value) = 0;
+
+ /**
* Add namespace attributes for a node to the list of pending attributes.
*
* @param src source node
@@ -628,7 +639,6 @@
* Execute the supplied XPath and and create a
* variable in the current context.
*
- * @param element element marker for variable
* @param str string expression for XPath evaluation
* @param contextNode current node in the source tree
* @param resolver resolver for namespace resolution
@@ -636,7 +646,6 @@
*/
virtual const XObjectPtr
createVariable(
- const ElemTemplateElement* element,
const XPath& xpath,
XalanNode* contextNode,
const PrefixResolver& resolver) = 0;
@@ -645,14 +654,12 @@
* Create an ResultTreeFragment as a variable and push it
* on to the stack with the current context.
*
- * @param element element marker for variable
* @param templateChild result tree fragment to use.
* @param sourceNode source node
* @return a pointer to the XObject result
*/
virtual const XObjectPtr
createVariable(
- const ElemTemplateElement* element,
const ElemTemplateElement& templateChild,
XalanNode* sourceNode) = 0;
@@ -1814,10 +1821,17 @@
virtual void
getNodeSetByKey(
- XalanNode* doc,
+ XalanDocument* doc,
+ const XalanQName& qname,
+ const XalanDOMString& ref,
+ MutableNodeRefList& nodelist) = 0;
+
+ virtual void
+ getNodeSetByKey(
+ XalanDocument* doc,
const XalanDOMString& name,
const XalanDOMString& ref,
- const PrefixResolver& resolver,
+ const Locator* locator,
MutableNodeRefList& nodelist) = 0;
virtual const XObjectPtr
1.99 +55 -14 xml-xalan/c/src/XSLT/StylesheetExecutionContextDefault.cpp
Index: StylesheetExecutionContextDefault.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetExecutionContextDefault.cpp,v
retrieving revision 1.98
retrieving revision 1.99
diff -u -r1.98 -r1.99
--- StylesheetExecutionContextDefault.cpp 12 Sep 2002 21:31:47 -0000 1.98
+++ StylesheetExecutionContextDefault.cpp 21 Sep 2002 01:24:41 -0000 1.99
@@ -79,7 +79,6 @@
-#include <XPath/XalanQNameByReference.hpp>
#include <XPath/ResultTreeFragBase.hpp>
#include <XPath/XObjectFactory.hpp>
#include <XPath/XPath.hpp>
@@ -170,7 +169,8 @@
m_usePerInstanceDocumentFactory(true),
m_cloneTextNodesOnly(false),
m_escapeURLs(eEscapeURLsDefault),
- m_omitMETATag(eOmitMETATagDefault)
+ m_omitMETATag(eOmitMETATagDefault),
+ m_scratchQName()
{
}
@@ -212,7 +212,8 @@
m_documentAllocator(eDocumentAllocatorBlockSize),
m_usePerInstanceDocumentFactory(true),
m_cloneTextNodesOnly(false),
- m_escapeURLs(eEscapeURLsDefault)
+ m_escapeURLs(eEscapeURLsDefault),
+ m_scratchQName()
{
}
@@ -431,6 +432,18 @@
void
+StylesheetExecutionContextDefault::addResultAttribute(
+ const XalanDOMString& aname,
+ const XalanDOMChar* value)
+{
+ assert(m_xsltProcessor != 0);
+
+ m_xsltProcessor->addResultAttribute(aname, value);
+}
+
+
+
+void
StylesheetExecutionContextDefault::copyNamespaceAttributes(const XalanNode& src)
{
assert(m_xsltProcessor != 0);
@@ -629,7 +642,6 @@
const XObjectPtr
StylesheetExecutionContextDefault::createVariable(
- const ElemTemplateElement* /* element */,
const XPath& xpath,
XalanNode* contextNode,
const PrefixResolver& resolver)
@@ -641,7 +653,6 @@
const XObjectPtr
StylesheetExecutionContextDefault::createVariable(
- const ElemTemplateElement* /* element */,
const ElemTemplateElement& templateChild,
XalanNode* sourceNode)
{
@@ -807,11 +818,9 @@
const XObjectPtr
StylesheetExecutionContextDefault::getParamVariable(const XalanQName& theName)
{
- bool fFound;
-
- const XObjectPtr theValue(m_variablesStack.getParamVariable(theName, *this, fFound));
+ bool fFound;
- return theValue;
+ return m_variablesStack.getParamVariable(theName, *this, fFound);
}
@@ -1837,15 +1846,49 @@
void
StylesheetExecutionContextDefault::getNodeSetByKey(
- XalanNode* doc,
+ XalanDocument* doc,
+ const XalanQName& qname,
+ const XalanDOMString& ref,
+ MutableNodeRefList& nodelist)
+{
+ assert(m_stylesheetRoot != 0);
+
+ m_stylesheetRoot->getNodeSetByKey(
+ doc,
+ qname,
+ ref,
+ *getPrefixResolver(),
+ nodelist,
+ *this,
+ m_keyTables);
+}
+
+
+
+void
+StylesheetExecutionContextDefault::getNodeSetByKey(
+ XalanDocument* doc,
const XalanDOMString& name,
const XalanDOMString& ref,
- const PrefixResolver& resolver,
+ const Locator* locator,
MutableNodeRefList& nodelist)
{
assert(m_stylesheetRoot != 0);
- m_stylesheetRoot->getNodeSetByKey(doc, name, ref, resolver, nodelist, *this, m_keyTables);
+ const PrefixResolver* const resolver =
+ getPrefixResolver();
+ assert(resolver != 0);
+
+ m_scratchQName.set(name, resolver, locator);
+
+ m_stylesheetRoot->getNodeSetByKey(
+ doc,
+ m_scratchQName,
+ ref,
+ *resolver,
+ nodelist,
+ *this,
+ m_keyTables);
}
@@ -2342,7 +2385,6 @@
{
theXObject =
createVariable(
- &xslCallTemplateElement,
*pxpath,
sourceNode,
*xslParamElement);
@@ -2351,7 +2393,6 @@
{
theXObject =
createVariable(
- &xslCallTemplateElement,
*xslParamElement,
sourceNode);
}
1.83 +16 -4 xml-xalan/c/src/XSLT/StylesheetExecutionContextDefault.hpp
Index: StylesheetExecutionContextDefault.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetExecutionContextDefault.hpp,v
retrieving revision 1.82
retrieving revision 1.83
diff -u -r1.82 -r1.83
--- StylesheetExecutionContextDefault.hpp 13 Aug 2002 05:37:06 -0000 1.82
+++ StylesheetExecutionContextDefault.hpp 21 Sep 2002 01:24:41 -0000 1.83
@@ -348,6 +348,11 @@
const XalanDOMString& value);
virtual void
+ addResultAttribute(
+ const XalanDOMString& aname,
+ const XalanDOMChar* value);
+
+ virtual void
copyNamespaceAttributes(const XalanNode& src);
virtual const XalanDOMString*
@@ -397,14 +402,12 @@
virtual const XObjectPtr
createVariable(
- const ElemTemplateElement* element,
const XPath& xpath,
XalanNode* contextNode,
const PrefixResolver& resolver);
virtual const XObjectPtr
createVariable(
- const ElemTemplateElement* element,
const ElemTemplateElement& templateChild,
XalanNode* sourceNode);
@@ -877,11 +880,18 @@
releaseCachedString(XalanDOMString& theString);
virtual void
+ getNodeSetByKey(
+ XalanDocument* doc,
+ const XalanQName& qname,
+ const XalanDOMString& ref,
+ MutableNodeRefList& nodelist);
+
+ virtual void
getNodeSetByKey(
- XalanNode* doc,
+ XalanDocument* doc,
const XalanDOMString& name,
const XalanDOMString& ref,
- const PrefixResolver& resolver,
+ const Locator* locator,
MutableNodeRefList& nodelist);
virtual const XObjectPtr
@@ -1171,6 +1181,8 @@
// Determines whether or not to override the property in the stylesheet.
eOmitMETATag m_omitMETATag;
+
+ XalanQNameByValue m_scratchQName;
static XalanNumberFormatFactory s_defaultXalanNumberFormatFactory;
1.86 +13 -12 xml-xalan/c/src/XSLT/StylesheetHandler.cpp
Index: StylesheetHandler.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetHandler.cpp,v
retrieving revision 1.85
retrieving revision 1.86
diff -u -r1.85 -r1.86
--- StylesheetHandler.cpp 5 Sep 2002 01:38:21 -0000 1.85
+++ StylesheetHandler.cpp 21 Sep 2002 01:24:41 -0000 1.86
@@ -144,6 +144,7 @@
m_inTemplate(false),
m_foundStylesheet(false),
m_foundNotImport(false),
+ m_elementLocalName(),
m_accumulateText(),
m_includeBase(stylesheetTree.getBaseIdentifier()),
m_inExtensionElementStack(),
@@ -261,11 +262,9 @@
const Locator* locator,
bool& fPreserve)
{
- const XalanDOMString theAttributeName(aname);
+ m_spaceAttributeQName.set(aname, m_stylesheet.getNamespaces(), locator, true);
- const XalanQNameByValue theName(theAttributeName, m_stylesheet.getNamespaces());
-
- const bool isSpaceAttr = s_spaceAttrQName.equals(theName);
+ const bool isSpaceAttr = s_spaceAttrQName.equals(m_spaceAttributeQName);
if(isSpaceAttr == false)
{
@@ -384,11 +383,13 @@
error("Could not resolve prefix.", locator);
}
- XalanDOMString localName(name, nameLength);
-
if (index < nameLength)
{
- localName.erase(0, index + 1);
+ m_elementLocalName.assign(name + index + 1, nameLength - index - 1);
+ }
+ else
+ {
+ m_elementLocalName.assign(name, nameLength);
}
ElemTemplateElement* elem = 0;
@@ -406,11 +407,11 @@
m_stylesheet.setWrapperless(false);
}
- const int xslToken = m_constructionContext.getElementToken(localName);
+ const int xslToken = m_constructionContext.getElementToken(m_elementLocalName);
if(!m_inTemplate)
{
- processTopLevelElement(name, localName, ns, atts, xslToken, locator, fPreserveSpace, fSpaceAttrProcessed);
+ processTopLevelElement(name, m_elementLocalName, ns, atts, xslToken, locator, fPreserveSpace, fSpaceAttrProcessed);
}
else
{
@@ -693,7 +694,7 @@
default:
{
- const XalanDOMString msg("Unknown XSL element: " + localName);
+ const XalanDOMString msg("Unknown XSL element: " + m_elementLocalName);
// If this stylesheet is declared to be of a higher version than the one
// supported, don't flag an error.
@@ -713,7 +714,7 @@
}
else if (!m_inTemplate && startsWith(ns, m_constructionContext.getXalanXSLNameSpaceURL()))
{
- processExtensionElement(name, localName, atts, locator);
+ processExtensionElement(name, m_elementLocalName, atts, locator);
}
else
{
@@ -751,7 +752,7 @@
lineNumber,
columnNumber,
*nsh,
- localName);
+ m_elementLocalName);
assert(m_inExtensionElementStack.empty() == false);
1.34 +4 -0 xml-xalan/c/src/XSLT/StylesheetHandler.hpp
Index: StylesheetHandler.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetHandler.hpp,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -r1.33 -r1.34
--- StylesheetHandler.hpp 5 Aug 2002 04:57:50 -0000 1.33
+++ StylesheetHandler.hpp 21 Sep 2002 01:24:41 -0000 1.34
@@ -595,6 +595,10 @@
*/
bool m_foundNotImport;
+ XalanDOMString m_elementLocalName;
+
+ XalanQNameByValue m_spaceAttributeQName;
+
/**
* Accumulate character buffer to create contiguous character data
* where possible.
1.62 +5 -8 xml-xalan/c/src/XSLT/StylesheetRoot.cpp
Index: StylesheetRoot.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetRoot.cpp,v
retrieving revision 1.61
retrieving revision 1.62
diff -u -r1.61 -r1.62
--- StylesheetRoot.cpp 5 Sep 2002 22:01:16 -0000 1.61
+++ StylesheetRoot.cpp 21 Sep 2002 01:24:41 -0000 1.62
@@ -721,8 +721,8 @@
void
StylesheetRoot::getNodeSetByKey(
- XalanNode* doc,
- const XalanDOMString& name,
+ XalanDocument* doc,
+ const XalanQName& qname,
const XalanDOMString& ref,
const PrefixResolver& resolver,
MutableNodeRefList& nodelist,
@@ -736,27 +736,24 @@
const KeyTablesTableType::const_iterator i =
theKeysTable.find(doc);
- const XalanQNameByValue theQName(name, &resolver);
-
if (i != theKeysTable.end())
{
- const NodeRefListBase& nl = (*i).second->getNodeSetByKey(theQName, ref);
+ const NodeRefListBase& nl = (*i).second->getNodeSetByKey(qname, ref);
nodelist.addNodesInDocOrder(nl, executionContext);
}
else
{
KeyTable* const kt =
- new KeyTable(doc,
+ new KeyTable(
doc,
resolver,
m_keyDeclarations,
executionContext);
- assert(doc == kt->getDocKey());
theKeysTable[doc] = kt;
- const NodeRefListBase& nl = kt->getNodeSetByKey(theQName, ref);
+ const NodeRefListBase& nl = kt->getNodeSetByKey(qname, ref);
nodelist.addNodesInDocOrder(nl, executionContext);
}
1.20 +3 -3 xml-xalan/c/src/XSLT/StylesheetRoot.hpp
Index: StylesheetRoot.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/StylesheetRoot.hpp,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- StylesheetRoot.hpp 13 Aug 2002 05:37:07 -0000 1.19
+++ StylesheetRoot.hpp 21 Sep 2002 01:24:41 -0000 1.20
@@ -425,7 +425,7 @@
* Given a valid element key, return the corresponding node list.
*
* @param doc source document
- * @param name name of the key, which must match the 'name'
+ * @param name qname of the key, which must match the 'name'
* attribute on xsl:key
* @param ref value that must match the value found by the
* 'match' attribute on xsl:key
@@ -435,8 +435,8 @@
*/
void
getNodeSetByKey(
- XalanNode* doc,
- const XalanDOMString& name,
+ XalanDocument* doc,
+ const XalanQName& qname,
const XalanDOMString& ref,
const PrefixResolver& resolver,
MutableNodeRefList& nodelist,
1.155 +15 -19 xml-xalan/c/src/XSLT/XSLTEngineImpl.cpp
Index: XSLTEngineImpl.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/XSLTEngineImpl.cpp,v
retrieving revision 1.154
retrieving revision 1.155
diff -u -r1.154 -r1.155
--- XSLTEngineImpl.cpp 6 Sep 2002 01:39:18 -0000 1.154
+++ XSLTEngineImpl.cpp 21 Sep 2002 01:24:41 -0000 1.155
@@ -1635,21 +1635,13 @@
void
-XSLTEngineImpl::addResultNamespaceDecl(
- const XalanDOMString& prefix,
- const XalanDOMString& namespaceVal)
-{
- m_resultNamespacesStack.addDeclaration(prefix, namespaceVal);
-}
-
-
-
-void
XSLTEngineImpl::addResultAttribute(
- AttributeListImpl& attList,
- const XalanDOMString& aname,
- const XalanDOMString& value)
+ AttributeListImpl& attList,
+ const XalanDOMString& aname,
+ const XalanDOMChar* value)
{
+ assert(value != 0);
+
// Always exclude the implicit XML declaration...
if (equals(aname, DOMServices::s_XMLNamespacePrefix) == false)
{
@@ -1665,18 +1657,20 @@
const XalanDOMString* const currentDefaultNamespace =
getNamespaceForPrefix(s_emptyString);
+ const XalanDOMString::size_type theLength = length(value);
+
// Note that we use an empty string for the prefix, instead of "xmlns", since the
// prefix really is "".
- if (length(value) != 0)
+ if (theLength != 0)
{
if (currentDefaultNamespace != 0 &&
- equals(*currentDefaultNamespace, value) == true)
+ equals(*currentDefaultNamespace, value, theLength) == true)
{
fExcludeAttribute = true;
}
else
{
- addResultNamespaceDecl(s_emptyString, value);
+ addResultNamespaceDecl(s_emptyString, value, theLength);
}
}
else
@@ -1686,7 +1680,7 @@
// the namespace declaration _and_ don't add the attribute.
if (currentDefaultNamespace != 0 && length(*currentDefaultNamespace) != 0)
{
- addResultNamespaceDecl(s_emptyString, value);
+ addResultNamespaceDecl(s_emptyString, value, theLength);
}
else
{
@@ -1706,9 +1700,11 @@
const XalanDOMString* const theNamespace = getResultNamespaceForPrefix(prefix);
- if (theNamespace == 0 || equals(*theNamespace, value) == false)
+ const XalanDOMString::size_type theLength = length(value);
+
+ if (theNamespace == 0 || equals(*theNamespace, value, theLength) == false)
{
- addResultNamespaceDecl(prefix, value);
+ addResultNamespaceDecl(prefix, value, theLength);
}
else
{
1.94 +72 -6 xml-xalan/c/src/XSLT/XSLTEngineImpl.hpp
Index: XSLTEngineImpl.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/XSLTEngineImpl.hpp,v
retrieving revision 1.93
retrieving revision 1.94
diff -u -r1.93 -r1.94
--- XSLTEngineImpl.hpp 6 Sep 2002 01:39:18 -0000 1.93
+++ XSLTEngineImpl.hpp 21 Sep 2002 01:24:41 -0000 1.94
@@ -436,7 +436,32 @@
void
addResultNamespaceDecl(
const XalanDOMString& prefix,
- const XalanDOMString& namespaceVal);
+ const XalanDOMString& namespaceVal)
+ {
+ addResultNamespaceDecl(
+ prefix,
+ namespaceVal.c_str(),
+ namespaceVal.length());
+ }
+
+ /**
+ * Add a namespace declaration to the namespace stack
+ *
+ * @param prefix namespace prefix
+ * @param namespaceVal value of namespace
+ * @param len length of namespace
+ */
+ void
+ addResultNamespaceDecl(
+ const XalanDOMString& prefix,
+ const XalanDOMChar* namespaceVal,
+ XalanDOMString::size_type len)
+ {
+ m_resultNamespacesStack.addDeclaration(
+ prefix,
+ namespaceVal,
+ len);
+ }
/**
* Add attribute to attribute list, and if it is a namespace, add it to the
@@ -448,9 +473,49 @@
*/
void
addResultAttribute(
- AttributeListImpl& attList,
+ AttributeListImpl& attList,
const XalanDOMString& aname,
- const XalanDOMString& value);
+ const XalanDOMString& value)
+ {
+ addResultAttribute(
+ attList,
+ aname,
+ value.c_str());
+ }
+
+ /**
+ * Add attribute to attribute list, and if it is a namespace, add it to the
+ * namespaces stack.
+ *
+ * @param attList attribute list added to
+ * @param aname name of attribute
+ * @param value value of attribute
+ */
+ void
+ addResultAttribute(
+ AttributeListImpl& attList,
+ const XalanDOMString& aname,
+ const XalanDOMChar* value);
+
+ /**
+ * Add attribute to pending attributes list, and if it is a namespace, add
+ * it to the namespaces stack.
+ *
+ * @param aname name of attribute
+ * @param value value of attribute
+ */
+ void
+ addResultAttribute(
+ const XalanDOMString& aname,
+ const XalanDOMChar* value)
+ {
+ assert(m_outputContextStack.empty() == false);
+
+ addResultAttribute(
+ getPendingAttributesImpl(),
+ aname,
+ value);
+ }
/**
* Add attribute to pending attributes list, and if it is a namespace, add
@@ -466,9 +531,10 @@
{
assert(m_outputContextStack.empty() == false);
- addResultAttribute(getPendingAttributesImpl(),
- aname,
- value);
+ addResultAttribute(
+ getPendingAttributesImpl(),
+ aname,
+ value);
}
void
---------------------------------------------------------------------
To unsubscribe, e-mail: xalan-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xalan-cvs-help@xml.apache.org