dbertoni 01/01/28 17:11:49
Modified: c/src/XSLT StylesheetHandler.cpp StylesheetHandler.hpp
Log:
Fix to ignore anything inside an extension element.
Revision Changes Path
1.53 +65 -13 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.52
retrieving revision 1.53
diff -u -r1.52 -r1.53
--- StylesheetHandler.cpp 2001/01/25 17:09:36 1.52
+++ StylesheetHandler.cpp 2001/01/29 01:11:49 1.53
@@ -142,6 +142,7 @@
m_foundStylesheet(false),
m_foundNotImport(false),
m_accumulateText(),
+ m_inExtensionElementStack(),
m_inLXSLTScript(false),
m_LXSLTScriptBody(),
m_LXSLTScriptLang(),
@@ -215,6 +216,7 @@
void StylesheetHandler::endDocument()
{
m_constructionContext.popLocatorStack();
+ m_inExtensionElementStack.clear();
if (m_exceptionPending == true)
{
@@ -274,6 +276,8 @@
if (m_exceptionPending == true)
return;
+ m_inExtensionElementStack.push_back(false);
+
try
{
#if !defined(XALAN_NO_NAMESPACES)
@@ -427,7 +431,7 @@
}
}
- if(!foundIt)
+ if(!foundIt && inExtensionElement() ==
false)
{
XalanDOMString
msg("(StylesheetHandler) " + XalanDOMString(name) +
" requires a " +
Constants::ATTRNAME_ELEMENTS + " attribute!");
@@ -524,12 +528,13 @@
case Constants::ELEMNAME_COUNTERRESET:
case Constants::ELEMNAME_COUNTERSCOPE:
case Constants::ELEMNAME_APPLY_IMPORTS:
- {
- XalanDOMString msg("(StylesheetHandler)
" + XalanDOMString(name) + " not allowed inside a stylesheet!");
+ if (inExtensionElement() == false)
+ {
+ XalanDOMString
msg("(StylesheetHandler) " + XalanDOMString(name) + " not allowed inside a
stylesheet!");
- throw SAXException(toCharArray(msg));
- }
- // break;
+ throw
SAXException(toCharArray(msg));
+ }
+ break;
case Constants::ELEMNAME_STYLESHEET:
{
@@ -568,9 +573,10 @@
const
XalanDOMString prefix = tokenizer.nextToken();
// SANJIVA: ask
Scott: is the line below correct?
- const
XalanDOMString extns = m_stylesheet.getNamespaceForPrefixFromStack(prefix);
+ const
XalanDOMString& extns = m_stylesheet.getNamespaceForPrefixFromStack(prefix);
ExtensionNSHandler* const nsh = new ExtensionNSHandler(extns);
+
m_stylesheet.addExtensionNamespace(extns, nsh);
}
}
@@ -615,11 +621,12 @@
break;
default:
- {
- XalanDOMString msg("Unknown XSL
element: " + localName);
+ if (inExtensionElement() == false)
+ {
+ XalanDOMString msg("Unknown XSL
element: " + localName);
- throw
SAXException(c_wstr(TranscodeFromLocalCodePage("Unknown XSL element: ") +
localName));
- }
+ throw
SAXException(c_wstr(TranscodeFromLocalCodePage("Unknown XSL element: ") +
localName));
+ }
break;
}
@@ -922,6 +929,10 @@
nsh = new ExtensionNSHandler(extns);
m_stylesheet.addExtensionNamespace(extns, nsh);
+
+
assert(m_inExtensionElementStack.empty() == false);
+
+ m_inExtensionElementStack.back() = true;
}
if (!isEmpty(elements))
@@ -995,6 +1006,10 @@
columnNumber,
*nsh,
localName);
+
+
assert(m_inExtensionElementStack.empty() == false);
+
+ m_inExtensionElementStack.back() = true;
}
else
{
@@ -1076,7 +1091,7 @@
ElemTemplateElement*
-StylesheetHandler::initWrapperless (
+StylesheetHandler::initWrapperless(
const XalanDOMChar* name,
const AttributeList& atts,
int
lineNumber,
@@ -1363,6 +1378,10 @@
m_pLXSLTExtensionNSH = 0;
}
// END SANJIVA CODE
+
+ assert(m_inExtensionElementStack.empty() == false);
+
+ m_inExtensionElementStack.pop_back();
}
@@ -1590,6 +1609,36 @@
+bool
+StylesheetHandler::inExtensionElement() const
+{
+ if (m_inExtensionElementStack.size() == 0)
+ {
+ return false;
+ }
+ else
+ {
+ BoolStackType::const_reverse_iterator i =
m_inExtensionElementStack.rbegin();
+ const BoolStackType::const_reverse_iterator theEnd
= m_inExtensionElementStack.rend();
+
+ while(i != theEnd)
+ {
+ if ((*i) == true)
+ {
+ return true;
+ }
+ else
+ {
+ ++i;
+ }
+ }
+
+ return false;
+ }
+}
+
+
+
StylesheetHandler::PushPopIncludeState::PushPopIncludeState(StylesheetHandler&
theHandler) :
m_handler(theHandler),
m_elemStack(theHandler.m_elemStack),
@@ -1602,7 +1651,8 @@
m_foundNotImport(theHandler.m_foundNotImport),
m_namespaceDecls(),
m_namespaces(),
- m_namespacesHandler()
+ m_namespacesHandler(),
+ m_inExtensionElementStack()
{
clear(m_handler.m_accumulateText);
m_handler.m_elemStack.clear();
@@ -1617,6 +1667,7 @@
m_namespaceDecls.swap(theHandler.m_stylesheet.getNamespaceDecls());
m_namespaces.swap(theHandler.m_stylesheet.getNamespaces());
m_namespacesHandler.swap(theHandler.m_stylesheet.getNamespacesHandler());
+ m_inExtensionElementStack.swap(theHandler.m_inExtensionElementStack);
}
@@ -1648,4 +1699,5 @@
m_handler.m_stylesheet.getNamespaceDecls().swap(m_namespaceDecls);
m_handler.m_stylesheet.getNamespaces().swap(m_namespaces);
m_handler.m_stylesheet.getNamespacesHandler().swap(m_namespacesHandler);
+ m_handler.m_inExtensionElementStack.swap(m_inExtensionElementStack);
}
1.22 +11 -2 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.21
retrieving revision 1.22
diff -u -r1.21 -r1.22
--- StylesheetHandler.hpp 2001/01/03 15:18:27 1.21
+++ StylesheetHandler.hpp 2001/01/29 01:11:49 1.22
@@ -108,10 +108,12 @@
typedef vector<ElemTextLiteral*>
ElemTextLiteralStackType;
typedef set<ElemTemplateElement*,
less<ElemTemplateElement*> >
ElemTemplateSetType;
+ typedef vector<bool>
BoolStackType;
#else
typedef std::vector<ElemTemplateElement*> ElemTemplateStackType;
typedef std::vector<ElemTextLiteral*>
ElemTextLiteralStackType;
typedef std::set<ElemTemplateElement*> ElemTemplateSetType;
+ typedef std::vector<bool>
BoolStackType;
#endif
/**
@@ -421,6 +423,9 @@
void
processAccumulatedText();
+ bool
+ inExtensionElement() const;
+
// Data members...
XalanDOMString m_pendingException;
@@ -429,7 +434,7 @@
/**
* The owning stylesheet.
*/
- Stylesheet& m_stylesheet;
+ Stylesheet& m_stylesheet;
/**
* The construction context.
@@ -494,7 +499,9 @@
* where possible.
*/
XalanDOMString m_accumulateText;
-
+
+ BoolStackType m_inExtensionElementStack;
+
// BEGIN SANJIVA CODE
bool m_inLXSLTScript;
XalanDOMString m_LXSLTScriptBody;
@@ -547,6 +554,8 @@
Stylesheet::NamespacesStackType m_namespaces;
NamespacesHandler
m_namespacesHandler;
+
+ BoolStackType
m_inExtensionElementStack;
};
friend class PushPopIncludeState;