You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@xalan.apache.org by "Steven J. Hathaway (Resolved) (JIRA)" <xa...@xml.apache.org> on 2011/12/07 05:41:40 UTC

[jira] [Resolved] (XALANC-275) xalan-c: proposed patch to separate out getting stylesheet uri in processing instruction

     [ https://issues.apache.org/jira/browse/XALANC-275?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Steven J. Hathaway resolved XALANC-275.
---------------------------------------

    Resolution: Won't Fix

Obsolete Issue
                
> xalan-c: proposed patch to separate out getting stylesheet uri in processing instruction
> ----------------------------------------------------------------------------------------
>
>                 Key: XALANC-275
>                 URL: https://issues.apache.org/jira/browse/XALANC-275
>             Project: XalanC
>          Issue Type: Bug
>          Components: XalanC
>    Affects Versions: 1.5
>         Environment: Operating System: All
> Platform: All
>            Reporter: David Yan
>
> This patch is to separate out the code that gets the stylesheet uri in
> the processing instruction in the parsed source xml.  This may seem
> trivial but is very useful if you want to see if you can use a
> precompiled stylesheet identified by the uri.  For example:
> typedef map<XalanDOMString, const XalanCompiledStylesheet *> CompiledStylesheetMap;
> static CompiledStylesheetMap compiledStylesheets;
> int transform(const char *url, const XalanParsedSource *parsedXML)
> {
>   XalanDOMString stylesheetURI;
>   // get the stylesheet uri in PI
>   if (XSLTEngineImpl::getStylesheetURIInPI(parsedXML->getDocument(),
>                                            stylesheetURI) == true) {
>     stylesheetURI = URISupport::getURLStringFromString(stylesheetURI,
> XalanDOMString(url));
>     const XalanCompiledStylesheet *theCompiledStylesheet = NULL;
>     CompiledStylesheetMap::iterator i = compiledStylesheets.find(stylesheetURI);
>     if (i == compiledStylesheets.end()) {
>       if (theTransformer->compileStylesheet(stylesheetURI,
> theCompiledStylesheet) == 0) {
>         compiledStylesheets.insert(pair<XalanDOMString, const XalanCompile
> dStylesheet *>(stylesheetURI, theCompiledStylesheet));
>       } else {
>         return -1;
>       }
>     } else {
>       theCompiledStylesheet = i->second;
>     }
>     theTransformer->transform(*parsedXML, theCompiledStylesheet, r,
> (XalanOutputHandlerType)xalanOutputHandler);
>   }
>   return 0;
> }
> ============= CUT HERE ===========================
> --- xml-xalan/c/src/XSLT/XSLTEngineImpl.hpp	Wed Dec 11 17:53:01 2002
> +++ xml-xalan/c/src/XSLT/XSLTEngineImpl.hpp	Wed Jun 18 16:20:12 2003
> @@ -1614,6 +1614,8 @@
>         {
>                 m_topLevelParams.clear();
>         }
> +       static bool getStylesheetURIInPI(const XalanNode *sourceTree, 
> +                                      XalanDOMString &theStylesheetURI);
>  
>  private:
>  
> --- xml-xalan/c/src/XSLT/XSLTEngineImpl.cpp	Wed Feb 12 14:41:26 2003
> +++ xml-xalan/c/src/XSLT/XSLTEngineImpl.cpp	Wed Jun 18 16:20:56 2003
> @@ -287,86 +287,20 @@
>  
>  	if(0 != sourceTree && m_stylesheetRoot == 0)
>  	{
> -		// Didn't get a stylesheet from the input source, so look for a
> -		// stylesheet processing instruction...
> -
> -		// The PI must be a child of the document...
> -		const XalanNode*	child = sourceTree->getFirstChild();
> -
> -		XalanDOMString		theCurrentToken;
> -		XalanDOMString		theStylesheetURI;
> -
> -		bool			isOK = false;
> -
> -		while(child != 0 && isOK == false && theStylesheetURI.empty() == true)
> -		{
> -			if(XalanNode::PROCESSING_INSTRUCTION_NODE == child->getNodeType())
> -			{
> -				const XalanDOMString&	nodeName = child->getNodeName();
> -
> -				if(equals(nodeName, s_stylesheetNodeName))
> -				{
> -					StringTokenizer 	tokenizer(child->getNodeValue(), s_piTokenizerString);
> -
> -					while(tokenizer.hasMoreTokens() == true && (isOK == false ||
> theStylesheetURI.empty() == true))
> -					{
> -						tokenizer.nextToken(theCurrentToken);
> -
> -						if(equals(theCurrentToken, s_typeString))
> -						{
> -							tokenizer.nextToken(theCurrentToken);
> -
> -
> -							const XalanDOMString::size_type		theLength =
> -									theCurrentToken.length();
> -
> -							if (theLength > 2)
> -							{
> -								theCurrentToken.erase(theLength - 1, 1);
> -								theCurrentToken.erase(0, 1);
> -
> -								if(equals(theCurrentToken, s_typeValueString1) ||
> -									equals(theCurrentToken, s_typeValueString2) ||
> -									equals(theCurrentToken, s_typeValueString3) ||
> -									equals(theCurrentToken, s_typeValueString4))
> -								{
> -									isOK = true;
> -								}
> -							}
> -						}
> -						else if(equals(theCurrentToken, s_hrefString))
> -						{
> -							tokenizer.nextToken(theCurrentToken);
> -
> -							const XalanDOMString::size_type		theLength =
> -									theCurrentToken.length();
> -
> -							if (theLength > 2)
> -							{
> -								// Trim of the starting and trailing delimiters...
> -								theStylesheetURI.assign(theCurrentToken, 1, theLength - 2);
> -							}
> -						}
> -					}
> -				}
> -			}
> -
> -			child = child->getNextSibling();
> -		}
> -
> -		if (isOK == true && theStylesheetURI.empty() == false)
> -		{
> -			const XalanDOMChar* const	pxch = inputSource.getSystemId();
> -
> -			const XalanDOMString		sysid(pxch == 0 ? &s_dummyString : pxch); 
> -
> -			getStylesheetFromPIURL(
> -					theStylesheetURI,
> -					*sourceTree,
> -					sysid,
> -					true,
> -					constructionContext);
> -		}
> +	  // Didn't get a stylesheet from the input source, so look for a
> +	  // stylesheet processing instruction...
> +	  XalanDOMString		theStylesheetURI;
> +	  if (getStylesheetURIInPI(sourceTree, theStylesheetURI) == true &&
> +	      theStylesheetURI.empty() == false) {
> +	    const XalanDOMChar* const	pxch = inputSource.getSystemId();
> +	    const XalanDOMString sysid(pxch == 0 ? &s_dummyString : pxch); 
> +	    getStylesheetFromPIURL(
> +				   theStylesheetURI,
> +				   *sourceTree,
> +				   sysid,
> +				   true,
> +				   constructionContext);
> +	  }
>  	}
>  
>  	if(0 == m_stylesheetRoot)
> @@ -3432,5 +3366,73 @@
>  }
>  
>  
> +bool XSLTEngineImpl::getStylesheetURIInPI(const XalanNode *sourceTree,
> +					  XalanDOMString &theStylesheetURI)
> +{
> +  // The PI must be a child of the document...
> +  const XalanNode*	child = sourceTree->getFirstChild();
> +
> +  XalanDOMString		theCurrentToken;
> +
> +  bool			isOK = false;
> +
> +  while(child != 0 && isOK == false && theStylesheetURI.empty() == true)
> +    {
> +      if(XalanNode::PROCESSING_INSTRUCTION_NODE == child->getNodeType())
> +	{
> +	  const XalanDOMString&	nodeName = child->getNodeName();
> +
> +	  if(equals(nodeName, s_stylesheetNodeName))
> +	    {
> +	      StringTokenizer 	tokenizer(child->getNodeValue(), s_piTokenizerString);
> +
> +	      while(tokenizer.hasMoreTokens() == true && (isOK == false ||
> theStylesheetURI.empty() == true))
> +		{
> +		  tokenizer.nextToken(theCurrentToken);
> +
> +		  if(equals(theCurrentToken, s_typeString))
> +		    {
> +		      tokenizer.nextToken(theCurrentToken);
> +
> +
> +		      const XalanDOMString::size_type		theLength =
> +			theCurrentToken.length();
> +
> +		      if (theLength > 2)
> +			{
> +			  theCurrentToken.erase(theLength - 1, 1);
> +			  theCurrentToken.erase(0, 1);
> +
> +			  if(equals(theCurrentToken, s_typeValueString1) ||
> +			     equals(theCurrentToken, s_typeValueString2) ||
> +			     equals(theCurrentToken, s_typeValueString3) ||
> +			     equals(theCurrentToken, s_typeValueString4))
> +			    {
> +			      isOK = true;
> +			    }
> +			}
> +		    }
> +		  else if(equals(theCurrentToken, s_hrefString))
> +		    {
> +		      tokenizer.nextToken(theCurrentToken);
> +
> +		      const XalanDOMString::size_type		theLength =
> +			theCurrentToken.length();
> +
> +		      if (theLength > 2)
> +			{
> +			  // Trim of the starting and trailing delimiters...
> +			  theStylesheetURI.assign(theCurrentToken, 1, theLength - 2);
> +			}
> +		    }
> +		}
> +	    }
> +	}
> +
> +      child = child->getNextSibling();
> +    }
> +
> +  return isOK;
> +}
>  
>  XALAN_CPP_NAMESPACE_END

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe, e-mail: xalan-dev-unsubscribe@xml.apache.org
For additional commands, e-mail: xalan-dev-help@xml.apache.org