dbertoni    2002/08/16 12:30:38

  Modified:    c/src/XPath XPathProcessorImpl.cpp XPathProcessorImpl.hpp
  Log:
  Support questionable namespace URIs by replacing prefixes with URIs after 
tokenization.
  
  Revision  Changes    Path
  1.58      +37 -3     xml-xalan/c/src/XPath/XPathProcessorImpl.cpp
  
  Index: XPathProcessorImpl.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XPathProcessorImpl.cpp,v
  retrieving revision 1.57
  retrieving revision 1.58
  diff -u -r1.57 -r1.58
  --- XPathProcessorImpl.cpp    26 Jun 2002 01:20:01 -0000      1.57
  +++ XPathProcessorImpl.cpp    16 Aug 2002 19:30:38 -0000      1.58
  @@ -93,7 +93,8 @@
        m_prefixResolver(0),
        m_requireLiterals(false),
        m_isMatchPattern(false),
  -     m_positionPredicateStack()
  +     m_positionPredicateStack(),
  +     m_namespaces()
   {
   }
   
  @@ -142,6 +143,7 @@
        m_prefixResolver = 0;
        m_locator = 0;
        m_positionPredicateStack.clear();
  +     m_namespaces.clear();
   }
   
   
  @@ -188,6 +190,7 @@
        m_prefixResolver = 0;
        m_locator = 0;
        m_positionPredicateStack.clear();
  +     m_namespaces.clear();
   }
   
   
  @@ -624,12 +627,32 @@
   
   
   
  +void
  +XPathProcessorImpl::replaceTokenWithNamespaceToken() const
  +{
  +     assert(m_xpath != 0);
  +     assert(m_expression != 0);
  +     assert(m_token.size() > 0);
  +
  +     StringToStringMapType::const_iterator   i = m_namespaces.find(m_token);
  +     assert(i != m_namespaces.end());
  +
  +     const XalanDOMString&   theNamespaceURI = (*i).second;
  +     assert(theNamespaceURI.size() != 0);
  +
  +     m_expression->replaceRelativeToken(
  +                     -1,
  +                     theNamespaceURI);
  +}
  +
  +
  +
   int
   XPathProcessorImpl::mapNSTokens(
                        const XalanDOMString&   pat,
                        int                                     startSubstring,
                        int                                     posOfNSSep,
  -                     int                                     posOfScan) const
  +                     int                                     posOfScan)
   {
        assert(m_prefixResolver != 0);
   
  @@ -659,7 +682,9 @@
        }
        else
        {
  -             addToTokenQueue(*uName);
  +             m_namespaces[prefix] = *uName;
  +
  +             addToTokenQueue(prefix);
   
                addToTokenQueue(DOMServices::s_XMLNamespaceSeparatorString);
   
  @@ -1731,6 +1756,9 @@
   
                XPathExpression::OpCodeMapValueVectorType       theArgs(2, 0);
   
  +             // Replace the token in the queue with the actual namespace 
URI...
  +             replaceTokenWithNamespaceToken();
  +
                theArgs[0] = m_expression->getTokenPosition() - 1;
   
                nextToken();
  @@ -2078,6 +2106,9 @@
                        }
                        else
                        {
  +                             // Replace the token in the queue with the 
actual namespace...
  +                             replaceTokenWithNamespaceToken();
  +
                                m_expression->pushCurrentTokenOnOpCodeMap();
                        }
   
  @@ -2197,6 +2228,9 @@
        }
        else
        {
  +             // Replace the token in the queue with the actual namespace...
  +             replaceTokenWithNamespaceToken();
  +
                m_expression->pushCurrentTokenOnOpCodeMap();
   
                nextToken();
  
  
  
  1.22      +11 -1     xml-xalan/c/src/XPath/XPathProcessorImpl.hpp
  
  Index: XPathProcessorImpl.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xalan/c/src/XPath/XPathProcessorImpl.hpp,v
  retrieving revision 1.21
  retrieving revision 1.22
  diff -u -r1.21 -r1.22
  --- XPathProcessorImpl.hpp    26 Jun 2002 01:20:01 -0000      1.21
  +++ XPathProcessorImpl.hpp    16 Aug 2002 19:30:38 -0000      1.22
  @@ -107,6 +107,9 @@
        typedef map<XalanDOMString,
                                XPathExpression::eOpCodes,
                                less<XalanDOMString> >          
NodeTypesMapType;
  +     typedef map<XalanDOMString,
  +                             XalanDOMString,
  +                             less<XalanDOMString> >          
StringToStringMapType;
   
        typedef vector<XalanDOMString>                  DOMStringVectorType;
   
  @@ -120,6 +123,8 @@
                                         XPathExpression::eOpCodes>             
AxisNamesMapType;
        typedef std::map<XalanDOMString,
                                         XPathExpression::eOpCodes>             
NodeTypesMapType;
  +     typedef std::map<XalanDOMString,
  +                                      XalanDOMString>                        
        StringToStringMapType;
   
        typedef std::vector<XalanDOMString>                             
DOMStringVectorType;
   
  @@ -195,6 +200,9 @@
        void
        addToTokenQueue(const XalanDOMString&   s) const;
   
  +     void
  +     replaceTokenWithNamespaceToken() const;
  +
        /**
         * When a separator token is found, see if there's a element name or the
         * like to map.
  @@ -204,7 +212,7 @@
                        const XalanDOMString&   pat,
                        int                                             
startSubstring,
                        int                                             
posOfNSSep,
  -                     int                                             
posOfScan) const;
  +                     int                                             
posOfScan);
   
        /**
         * Given a map pos, return the corresponding token queue pos.
  @@ -826,6 +834,8 @@
        const Locator*                                  m_locator;
   
        BoolVectorType                                  
m_positionPredicateStack;
  +
  +     StringToStringMapType                   m_namespaces;
   
        enum eDummy
        {
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to