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 2004/04/06 02:15:37 UTC
cvs commit: xml-xalan/c/src/xalanc/XSLT Stylesheet.cpp Stylesheet.hpp StylesheetExecutionContextDefault.cpp StylesheetExecutionContextDefault.hpp StylesheetHandler.cpp StylesheetRoot.cpp StylesheetRoot.hpp XSLTEngineImpl.cpp XSLTEngineImpl.hpp XalanSpaceNodeTester.cpp XalanSpaceNodeTester.hpp
dbertoni 2004/04/05 17:15:37
Modified: c/src/xalanc/XSLT Stylesheet.cpp Stylesheet.hpp
StylesheetExecutionContextDefault.cpp
StylesheetExecutionContextDefault.hpp
StylesheetHandler.cpp StylesheetRoot.cpp
StylesheetRoot.hpp XSLTEngineImpl.cpp
XSLTEngineImpl.hpp XalanSpaceNodeTester.cpp
XalanSpaceNodeTester.hpp
Log:
New code for improved preserve/strip space handling.
Revision Changes Path
1.10 +39 -4 xml-xalan/c/src/xalanc/XSLT/Stylesheet.cpp
Index: Stylesheet.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/xalanc/XSLT/Stylesheet.cpp,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- Stylesheet.cpp 26 Feb 2004 22:58:58 -0000 1.9
+++ Stylesheet.cpp 6 Apr 2004 00:15:36 -0000 1.10
@@ -84,6 +84,7 @@
m_stylesheetRoot(root),
m_baseIdent(baseIdentifier),
m_keyDeclarations(),
+ m_whitespaceElements(),
m_XSLTNamespaceURI(constructionContext.getXSLTNamespaceURI()),
m_imports(),
m_importsSize(0),
@@ -441,13 +442,40 @@
void
+Stylesheet::addWhitespaceElement(const XalanSpaceNodeTester& theTester)
+{
+ typedef WhitespaceElementsVectorType::iterator iterator;
+
+ const XPath::eMatchScore theMatchScore = theTester.getMatchScore();
+
+ iterator i = m_whitespaceElements.begin();
+
+ while(i != m_whitespaceElements.end())
+ {
+ if (theMatchScore >= (*i).getMatchScore())
+ {
+ break;
+ }
+ else
+ {
+ ++i;
+ }
+ }
+
+ m_whitespaceElements.insert(i, theTester);
+}
+
+
+
+void
Stylesheet::postConstruction(StylesheetConstructionContext& constructionContext)
{
{
m_importsSize = m_imports.size();
- // Call postConstruction() on any imported stylesheets, the get any aliases
- // in reverse order, to preserve import precedence. Also, get any key declarations.
+ // Call postConstruction() on any imported stylesheets, the get things
+ // in reverse order, to preserve import precedence. Also, get any key
+ // declarations and preserve/strip space information.
const StylesheetVectorType::reverse_iterator theEnd = m_imports.rend();
StylesheetVectorType::reverse_iterator i = m_imports.rbegin();
@@ -457,12 +485,19 @@
m_namespacesHandler.copyNamespaceAliases((*i)->getNamespacesHandler());
- // $$ ToDo: Should we clear the imported stylesheet's key
- // declarations after we copy them?
m_keyDeclarations.insert(
m_keyDeclarations.end(),
(*i)->m_keyDeclarations.begin(),
(*i)->m_keyDeclarations.end());
+
+ KeyDeclarationVectorType().swap((*i)->m_keyDeclarations);
+
+ m_whitespaceElements.insert(
+ m_whitespaceElements.end(),
+ (*i)->m_whitespaceElements.begin(),
+ (*i)->m_whitespaceElements.end());
+
+ WhitespaceElementsVectorType().swap((*i)->m_whitespaceElements);
++i;
}
1.9 +8 -0 xml-xalan/c/src/xalanc/XSLT/Stylesheet.hpp
Index: Stylesheet.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/xalanc/XSLT/Stylesheet.hpp,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- Stylesheet.hpp 26 Feb 2004 22:58:58 -0000 1.8
+++ Stylesheet.hpp 6 Apr 2004 00:15:36 -0000 1.9
@@ -46,6 +46,7 @@
#include <xalanc/XSLT/NamespacesHandler.hpp>
#include <xalanc/XSLT/KeyDeclaration.hpp>
#include <xalanc/XSLT/StylesheetExecutionContext.hpp>
+#include <xalanc/XSLT/XalanSpaceNodeTester.hpp>
@@ -104,6 +105,7 @@
typedef vector<Stylesheet*> StylesheetVectorType;
typedef vector<XalanDOMString> URLStackType;
typedef vector<ElemDecimalFormat*> ElemDecimalFormatVectorType;
+ typedef vector<XalanSpaceNodeTester> WhitespaceElementsVectorType;
#else
typedef std::map<XalanDOMString, ExtensionNSHandler*> ExtensionNamespacesMapType;
typedef std::map<XalanQNameByReference,
@@ -115,6 +117,7 @@
typedef std::vector<Stylesheet*> StylesheetVectorType;
typedef std::vector<XalanDOMString> URLStackType;
typedef std::vector<ElemDecimalFormat*> ElemDecimalFormatVectorType;
+ typedef std::vector<XalanSpaceNodeTester> WhitespaceElementsVectorType;
#endif
/**
@@ -261,6 +264,9 @@
m_namespaces.pop_back();
}
+ void
+ addWhitespaceElement(const XalanSpaceNodeTester& theTester);
+
/**
* Called after construction is completed.
*/
@@ -856,6 +862,8 @@
* xsl:key element.
*/
KeyDeclarationVectorType m_keyDeclarations;
+
+ WhitespaceElementsVectorType m_whitespaceElements;
static const XalanQNameByReference s_emptyQName;
1.25 +16 -7 xml-xalan/c/src/xalanc/XSLT/StylesheetExecutionContextDefault.cpp
Index: StylesheetExecutionContextDefault.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/xalanc/XSLT/StylesheetExecutionContextDefault.cpp,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -r1.24 -r1.25
--- StylesheetExecutionContextDefault.cpp 2 Apr 2004 02:45:34 -0000 1.24
+++ StylesheetExecutionContextDefault.cpp 6 Apr 2004 00:15:36 -0000 1.25
@@ -137,7 +137,8 @@
m_usePerInstanceDocumentFactory(false),
m_cloneTextNodesOnly(false),
m_escapeURLs(eEscapeURLsDefault),
- m_omitMETATag(eOmitMETATagDefault)
+ m_omitMETATag(eOmitMETATagDefault),
+ m_hasStripOrPreserveSpace(false)
{
m_currentTemplateStack.push_back(0);
}
@@ -178,7 +179,8 @@
m_documentAllocator(eDocumentAllocatorBlockSize),
m_usePerInstanceDocumentFactory(false),
m_cloneTextNodesOnly(false),
- m_escapeURLs(eEscapeURLsDefault)
+ m_escapeURLs(eEscapeURLsDefault),
+ m_hasStripOrPreserveSpace(false)
{
m_currentTemplateStack.push_back(0);
}
@@ -250,9 +252,11 @@
else
{
m_xsltProcessor->setExecutionContext(this);
- }
- m_countersTable.resize(theStylesheet->getElemNumberCount());
+ m_hasStripOrPreserveSpace = theStylesheet->hasPreserveOrStripSpaceElements();
+
+ m_countersTable.resize(theStylesheet->getElemNumberCount());
+ }
}
@@ -1747,6 +1751,8 @@
m_xpathExecutionContextDefault.reset();
m_cloneTextNodesOnly = false;
+
+ m_hasStripOrPreserveSpace = false;
}
@@ -2069,13 +2075,16 @@
bool
StylesheetExecutionContextDefault::shouldStripSourceNode(const XalanText& node)
{
- if (m_xsltProcessor == 0)
+ if (m_hasStripOrPreserveSpace == false || m_stylesheetRoot == 0)
{
- return m_xpathExecutionContextDefault.shouldStripSourceNode(node);
+ return false;
}
else
{
- return m_xsltProcessor->shouldStripSourceNode(*this, node);
+ assert(m_stylesheetRoot->hasPreserveOrStripSpaceElements() == true);
+ assert(length(node.getData()) != 0);
+
+ return m_stylesheetRoot->shouldStripSourceNode(node);
}
}
1.19 +2 -0 xml-xalan/c/src/xalanc/XSLT/StylesheetExecutionContextDefault.hpp
Index: StylesheetExecutionContextDefault.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/xalanc/XSLT/StylesheetExecutionContextDefault.hpp,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -r1.18 -r1.19
--- StylesheetExecutionContextDefault.hpp 2 Apr 2004 02:45:34 -0000 1.18
+++ StylesheetExecutionContextDefault.hpp 6 Apr 2004 00:15:36 -0000 1.19
@@ -1116,6 +1116,8 @@
// Determines whether or not to override the property in the stylesheet.
eOmitMETATag m_omitMETATag;
+ bool m_hasStripOrPreserveSpace;
+
static XalanNumberFormatFactory s_defaultXalanNumberFormatFactory;
static XalanNumberFormatFactory* s_xalanNumberFormatFactory;
1.14 +11 -22 xml-xalan/c/src/xalanc/XSLT/StylesheetHandler.cpp
Index: StylesheetHandler.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/xalanc/XSLT/StylesheetHandler.cpp,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- StylesheetHandler.cpp 2 Apr 2004 02:45:34 -0000 1.13
+++ StylesheetHandler.cpp 6 Apr 2004 00:15:36 -0000 1.14
@@ -1000,29 +1000,17 @@
while(tokenizer.hasMoreTokens())
{
- // Use only the root, at least for right now.
tokenizer.nextToken(theNameTest);
- /**
- * Creating a match pattern is too much overhead, but it's a reasonably
- * easy and safe way to do this right now.
- */
- const XPath* const matchPat =
- m_constructionContext.createMatchPattern(
- 0,
- theNameTest,
- theProxy);
-
- const XalanSpaceNodeTester theNodeTest(m_constructionContext, theNameTest, theProxy, locator);
-
- if(isPreserveSpace == true)
- {
- m_stylesheet.getStylesheetRoot().pushWhitespacePreservingElement(matchPat);
- }
- else
- {
- m_stylesheet.getStylesheetRoot().pushWhitespaceStrippingElement(matchPat);
- }
+ m_stylesheet.addWhitespaceElement(
+ XalanSpaceNodeTester(
+ isPreserveSpace == true ?
+ XalanSpaceNodeTester::ePreserve :
+ XalanSpaceNodeTester::eStrip,
+ m_constructionContext,
+ theNameTest,
+ theProxy,
+ locator));
}
}
else if(!isAttrOK(aname, atts, i))
@@ -1037,7 +1025,8 @@
XalanMessageLoader::getMessage(
XalanMessages::ElementRequiresAttribute_2Param,
isPreserveSpace == true ?
- Constants::ELEMNAME_PRESERVESPACE_WITH_PREFIX_STRING : Constants::ELEMNAME_STRIPSPACE_WITH_PREFIX_STRING,
+ Constants::ELEMNAME_PRESERVESPACE_WITH_PREFIX_STRING :
+ Constants::ELEMNAME_STRIPSPACE_WITH_PREFIX_STRING,
Constants::ATTRNAME_ELEMENTS),
locator);
}
1.15 +20 -63 xml-xalan/c/src/xalanc/XSLT/StylesheetRoot.cpp
Index: StylesheetRoot.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/xalanc/XSLT/StylesheetRoot.cpp,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- StylesheetRoot.cpp 3 Apr 2004 02:27:22 -0000 1.14
+++ StylesheetRoot.cpp 6 Apr 2004 00:15:36 -0000 1.15
@@ -103,8 +103,6 @@
m_indentAmount(-1),
m_omitMETATag(false),
m_elemNumberNextID(0),
- m_whitespacePreservingElements(),
- m_whitespaceStrippingElements(),
m_attributeSetsMap()
{
// Our base class has already resolved the URI and pushed it on
@@ -802,76 +800,35 @@
bool
-StylesheetRoot::shouldStripSourceNode(
- StylesheetExecutionContext& executionContext,
- const XalanText& textNode) const
+StylesheetRoot::shouldStripSourceNode(const XalanText& textNode) const
{
- bool strip = false;
-
- XalanNode* const parent = textNode.getParentNode();
- assert(parent != 0 && parent->getNodeType() == XalanNode::ELEMENT_NODE);
-
- XPath::eMatchScore highPreserveScore = XPath::eMatchScoreNone;
- XPath::eMatchScore highStripScore = XPath::eMatchScoreNone;
+ const XalanNode* const parent = textNode.getParentNode();
+ assert(parent != 0);
+ if (textNode.isIgnorableWhitespace() == true &&
+ parent->getNodeType() == XalanNode::ELEMENT_NODE)
{
- const XPathVectorType& theElements =
- m_whitespacePreservingElements;
-
- const XPathVectorType::size_type nTests =
- theElements.size();
-
- for(XPathVectorType::size_type i = 0; i < nTests; i++)
- {
- const XPath* const matchPat = theElements[i];
- assert(matchPat != 0);
-
- const XPath::eMatchScore score = matchPat->getMatchScore(parent, executionContext);
-
- if(score > highPreserveScore)
- highPreserveScore = score;
- }
- }
-
- {
- const XPathVectorType& theElements =
- m_whitespaceStrippingElements;
-
- const XPathVectorType::size_type nTests =
- theElements.size();
-
- for(XPathVectorType::size_type i = 0; i < nTests; i++)
- {
- const XPath* const matchPat =
- theElements[i];
- assert(matchPat != 0);
+ const XalanElement* const theElement =
+#if defined(XALAN_OLD_STYLE_CASTS)
+ (const XalanElement*)parent;
+#else
+ static_cast<const XalanElement*>(parent);
+#endif
- const XPath::eMatchScore score = matchPat->getMatchScore(parent, executionContext);
+ typedef WhitespaceElementsVectorType::const_iterator const_iterator;
- if(score > highStripScore)
- highStripScore = score;
- }
- }
-
- if(highPreserveScore > XPath::eMatchScoreNone ||
- highStripScore > XPath::eMatchScoreNone)
- {
- if(highPreserveScore > highStripScore)
+ for (const_iterator i = m_whitespaceElements.begin();
+ i != m_whitespaceElements.end();
+ ++i)
{
- strip = false;
- }
- else if(highStripScore > highPreserveScore)
- {
- strip = true;
- }
- else
- {
- executionContext.warn(
- XalanMessageLoader::getMessage(XalanMessages::MatchConflictBetween_strip_space_preserve_space));
+ if ((*i)(*theElement) != XPath::eMatchScoreNone)
+ {
+ return (*i).getType() == XalanSpaceNodeTester::eStrip;
+ }
}
}
- return strip;
+ return false;
}
1.7 +2 -29 xml-xalan/c/src/xalanc/XSLT/StylesheetRoot.hpp
Index: StylesheetRoot.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/xalanc/XSLT/StylesheetRoot.hpp,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- StylesheetRoot.hpp 26 Feb 2004 22:58:58 -0000 1.6
+++ StylesheetRoot.hpp 6 Apr 2004 00:15:36 -0000 1.7
@@ -57,14 +57,12 @@
#if defined(XALAN_NO_STD_NAMESPACE)
typedef vector<const XalanQName*> XalanQNameVectorType;
- typedef vector<const XPath*> XPathVectorType;
typedef vector<ElemAttributeSet*> AttributeSetVectorType;
typedef map<const XalanQName*,
AttributeSetVectorType,
pointer_less<const XalanQName> > AttributeSetMapType;
#else
typedef std::vector<const XalanQName*> XalanQNameVectorType;
- typedef std::vector<const XPath*> XPathVectorType;
typedef std::vector<ElemAttributeSet*> AttributeSetVectorType;
typedef std::map<const XalanQName*,
AttributeSetVectorType,
@@ -380,26 +378,11 @@
bool
hasPreserveOrStripSpaceElements() const
{
- return m_whitespacePreservingElements.empty() == false ||
- m_whitespaceStrippingElements.empty() == false;
- }
-
- void
- pushWhitespacePreservingElement(const XPath* theXPath)
- {
- m_whitespacePreservingElements.push_back(theXPath);
- }
-
- void
- pushWhitespaceStrippingElement(const XPath* theXPath)
- {
- m_whitespaceStrippingElements.push_back(theXPath);
+ return m_whitespaceElements.empty() == false;
}
bool
- shouldStripSourceNode(
- StylesheetExecutionContext& executionContext,
- const XalanText& textNode) const;
+ shouldStripSourceNode(const XalanText& textNode) const;
void
addAttributeSet(ElemAttributeSet& theAttributeSet);
@@ -549,16 +532,6 @@
* This is set to true if we should omit the META tag in HTML output (the default is false)
*/
unsigned long m_elemNumberNextID;
-
- /**
- * A lookup table of all space preserving elements.
- */
- XPathVectorType m_whitespacePreservingElements;
-
- /**
- * A lookup table of all space stripping elements.
- */
- XPathVectorType m_whitespaceStrippingElements;
/**
* A lookup table of all attribute sets.
1.16 +1 -36 xml-xalan/c/src/xalanc/XSLT/XSLTEngineImpl.cpp
Index: XSLTEngineImpl.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/xalanc/XSLT/XSLTEngineImpl.cpp,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- XSLTEngineImpl.cpp 3 Apr 2004 02:26:29 -0000 1.15
+++ XSLTEngineImpl.cpp 6 Apr 2004 00:15:36 -0000 1.16
@@ -156,7 +156,6 @@
m_dummyAttributesList(),
m_scratchString(),
m_attributeNamesVisited(),
- m_hasStripOrPreserveSpace(false),
m_hasCDATASectionElements(false),
m_xpathConstructionContext()
{
@@ -188,7 +187,6 @@
m_attributeNamesVisited.clear();
- m_hasStripOrPreserveSpace = false;
m_hasCDATASectionElements = false;
m_xpathConstructionContext.reset();
@@ -342,8 +340,6 @@
theFormatter->setPrefixResolver(this);
}
- m_hasStripOrPreserveSpace = m_stylesheetRoot->hasPreserveOrStripSpaceElements();
-
m_hasCDATASectionElements = m_stylesheetRoot->hasCDATASectionElements();
m_stylesheetRoot->process(sourceTree, outputTarget, executionContext);
@@ -387,8 +383,6 @@
theFormatter->setPrefixResolver(this);
}
- m_hasStripOrPreserveSpace = m_stylesheetRoot->hasPreserveOrStripSpaceElements();
-
m_hasCDATASectionElements = m_stylesheetRoot->hasCDATASectionElements();
m_stylesheetRoot->process(sourceTree, outputTarget, executionContext);
@@ -2040,7 +2034,7 @@
node.getParentNode()->getNodeType() != XalanNode::DOCUMENT_NODE);
if (overrideStrip == true ||
- shouldStripSourceNode(*m_executionContext, node) == false)
+ m_executionContext->shouldStripSourceNode(node) == false)
{
const XalanDOMString& data = node.getData();
assert(0 != length(data));
@@ -2938,35 +2932,6 @@
attr->getNodeName(),
attr->getNodeValue(),
attList);
- }
- }
-}
-
-
-
-bool
-XSLTEngineImpl::shouldStripSourceNode(
- StylesheetExecutionContext& executionContext,
- const XalanText& textNode) const
-{
- if (m_hasStripOrPreserveSpace == false || m_stylesheetRoot == 0)
- {
- return false;
- }
- else
- {
- assert(m_stylesheetRoot->hasPreserveOrStripSpaceElements() == true);
- assert(length(textNode.getData()) != 0);
-
- if(textNode.isIgnorableWhitespace() == false)
- {
- return false;
- }
- else
- {
- return m_stylesheetRoot->shouldStripSourceNode(
- executionContext,
- textNode);
}
}
}
1.10 +0 -20 xml-xalan/c/src/xalanc/XSLT/XSLTEngineImpl.hpp
Index: XSLTEngineImpl.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/xalanc/XSLT/XSLTEngineImpl.hpp,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- XSLTEngineImpl.hpp 2 Apr 2004 02:45:34 -0000 1.9
+++ XSLTEngineImpl.hpp 6 Apr 2004 00:15:36 -0000 1.10
@@ -663,24 +663,6 @@
XalanDOMString::size_type length);
/**
- * Tells, through the combination of the default-space attribute on
- * xsl:stylesheet, xsl:strip-space, xsl:preserve-space, and the xml:space
- * attribute, whether or not extra whitespace should be stripped from the
- * node. Literal elements from template elements should <em>not</em> be
- * tested with this function.
- *
- * @param executionContext current execution context
- * @param node text node from the source tree
- * @return true if the text node should be stripped of extra whitespace
- *
- * $$$ ToDo: This has no business being here in the engine...
- */
- bool
- shouldStripSourceNode(
- StylesheetExecutionContext& executionContext,
- const XalanText& node) const;
-
- /**
* Clone a node to the result tree
*
* @param node node to clone
@@ -1705,8 +1687,6 @@
XalanDOMString m_scratchString;
XalanDOMStringPointerVectorType m_attributeNamesVisited;
-
- bool m_hasStripOrPreserveSpace;
bool m_hasCDATASectionElements;
1.2 +20 -109 xml-xalan/c/src/xalanc/XSLT/XalanSpaceNodeTester.cpp
Index: XalanSpaceNodeTester.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/xalanc/XSLT/XalanSpaceNodeTester.cpp,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- XalanSpaceNodeTester.cpp 2 Apr 2004 02:45:34 -0000 1.1
+++ XalanSpaceNodeTester.cpp 6 Apr 2004 00:15:36 -0000 1.2
@@ -33,128 +33,39 @@
XalanSpaceNodeTester::XalanSpaceNodeTester() :
- m_nodeTester(),
- m_matchScore(XPath::eMatchScoreNone)
+ NodeTester(),
+ m_matchScore(XPath::eMatchScoreNone),
+ m_type(ePreserve)
{
}
-
-static const XalanDOMString s_emptyString;
+
+XalanSpaceNodeTester::XalanSpaceNodeTester(const XalanSpaceNodeTester& theSource) :
+ NodeTester(theSource),
+ m_matchScore(theSource.m_matchScore),
+ m_type(theSource.m_type)
+{
+}
+
XalanSpaceNodeTester::XalanSpaceNodeTester(
+ eType theType,
StylesheetConstructionContext& theConstructionContext,
const XalanDOMString& theNameTest,
const PrefixResolver& thePrefixResolver,
const LocatorType* theLocator) :
- m_nodeTester(),
- m_matchScore(XPath::eMatchScoreNone)
+ NodeTester(
+ theConstructionContext,
+ theNameTest,
+ thePrefixResolver,
+ theLocator,
+ &m_matchScore),
+ m_matchScore(),
+ m_type(theType)
{
- const XalanDOMString::size_type theLength =
- length(theNameTest);
-
- if (theLength == 1 && theNameTest[0] == XPath::PSEUDONAME_ANY[0])
- {
- m_nodeTester = XPath::NodeTester(s_emptyString, s_emptyString, m_matchScore);
- }
- else
- {
- const XalanDOMString::size_type theIndex =
- indexOf(theNameTest, XalanUnicode::charColon);
-
- // If there's no ':', it's an NCName...
- if (theIndex == theLength)
- {
- if (XalanQName::isValidNCName(theNameTest) == false)
- {
- theConstructionContext.error(
- XalanMessageLoader::getMessage(
- XalanMessages::IsNotValidQName_1Param,
- theNameTest),
- 0,
- theLocator);
- }
- else
- {
- m_nodeTester =
- XPath::NodeTester(
- s_emptyString,
- theConstructionContext.getPooledString(theNameTest),
- m_matchScore);
- }
- }
- else
- {
- StylesheetConstructionContext::GetAndReleaseCachedString scratchGuard(theConstructionContext);
-
- XalanDOMString& theScratchString = scratchGuard.get();
-
- theScratchString.assign(theNameTest, 0, theIndex);
-
- // Get the namespace URI for the prefix...
- const XalanDOMString* const theNamespaceURI =
- thePrefixResolver.getNamespaceForPrefix(theScratchString);
-
- if (theNamespaceURI == 0)
- {
- theConstructionContext.error(
- XalanMessageLoader::getMessage(
- XalanMessages::UndeclaredNamespacePrefix_1Param,
- theScratchString),
- 0,
- theLocator);
- }
- else
- {
- // OK, now we have a namespace URI...
- if (XalanQName::isValidNCName(theScratchString) == false)
- {
- theConstructionContext.error(
- XalanMessageLoader::getMessage(
- XalanMessages::IsNotValidQName_1Param,
- theNameTest),
- 0,
- theLocator);
- }
- else if (theIndex == theLength - 2 &&
- theNameTest[theIndex + 1] == XPath::PSEUDONAME_ANY[0])
- {
- // It's of the form "NCName:*"
- m_nodeTester =
- XPath::NodeTester(
- theConstructionContext.getPooledString(*theNamespaceURI),
- s_emptyString,
- m_matchScore);
- }
- else
- {
- theScratchString.assign(theNameTest, theIndex + 1, theLength - theIndex - 1);
-
- if (XalanQName::isValidNCName(theScratchString) == false)
- {
- theConstructionContext.error(
- XalanMessageLoader::getMessage(
- XalanMessages::IsNotValidQName_1Param,
- theNameTest),
- 0,
- theLocator);
- }
- else
- {
- // It's of the form "NCName:NCName"
- m_nodeTester =
- XPath::NodeTester(
- theConstructionContext.getPooledString(*theNamespaceURI),
- theConstructionContext.getPooledString(theScratchString),
- m_matchScore);
- }
- }
- }
- }
- }
-
assert(m_matchScore != XPath::eMatchScoreNone);
}
1.2 +29 -7 xml-xalan/c/src/xalanc/XSLT/XalanSpaceNodeTester.hpp
Index: XalanSpaceNodeTester.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/xalanc/XSLT/XalanSpaceNodeTester.hpp,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- XalanSpaceNodeTester.hpp 2 Apr 2004 02:45:34 -0000 1.1
+++ XalanSpaceNodeTester.hpp 6 Apr 2004 00:15:36 -0000 1.2
@@ -41,13 +41,24 @@
-class XalanSpaceNodeTester
+class XalanSpaceNodeTester : public XPath::NodeTester
{
public:
+ typedef XPath::NodeTester ParentType;
+
+ enum eType
+ {
+ eStrip,
+ ePreserve
+ };
+
XalanSpaceNodeTester();
+ XalanSpaceNodeTester(const XalanSpaceNodeTester& theSource);
+
XalanSpaceNodeTester(
+ eType theType,
StylesheetConstructionContext& theContext,
const XalanDOMString& theNameTest,
const PrefixResolver& thePrefixResolver,
@@ -61,17 +72,28 @@
return m_matchScore;
}
- XPath::eMatchScore
- operator()(const XalanNode& context) const
+ eType
+ getType() const
{
- return m_nodeTester(context);
+ return m_type;
}
-private:
+ XalanSpaceNodeTester&
+ operator=(const XalanSpaceNodeTester& theRHS)
+ {
+ m_matchScore = theRHS.m_matchScore;
+ m_type = theRHS.m_type;
- XPath::NodeTester m_nodeTester;
+ ParentType::operator=(theRHS);
+
+ return *this;
+ }
+
+private:
XPath::eMatchScore m_matchScore;
+
+ eType m_type;
};
---------------------------------------------------------------------
To unsubscribe, e-mail: xalan-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xalan-cvs-help@xml.apache.org