processorinclude.java

来自「java jdk 1.4的源码」· Java 代码 · 共 342 行

JAVA
342
字号
/* * The Apache Software License, Version 1.1 * * * Copyright (c) 1999 The Apache Software Foundation.  All rights  * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer.  * * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in *    the documentation and/or other materials provided with the *    distribution. * * 3. The end-user documentation included with the redistribution, *    if any, must include the following acknowledgment:   *       "This product includes software developed by the *        Apache Software Foundation (http://www.apache.org/)." *    Alternately, this acknowledgment may appear in the software itself, *    if and wherever such third-party acknowledgments normally appear. * * 4. The names "Xalan" and "Apache Software Foundation" must *    not be used to endorse or promote products derived from this *    software without prior written permission. For written  *    permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache", *    nor may "Apache" appear in their name, without prior written *    permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation and was * originally based on software copyright (c) 1999, Lotus * Development Corporation., http://www.lotus.com.  For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */package org.apache.xalan.processor;import org.apache.xml.utils.TreeWalker;import org.apache.xalan.templates.Stylesheet;import org.apache.xalan.res.XSLMessages;import org.apache.xalan.res.XSLTErrorResources;import javax.xml.transform.TransformerException;import org.xml.sax.Attributes;import org.xml.sax.XMLReader;import org.xml.sax.InputSource;import org.xml.sax.EntityResolver;import java.net.URL;import java.io.IOException;import org.xml.sax.helpers.XMLReaderFactory;import javax.xml.transform.URIResolver;import javax.xml.transform.stream.StreamSource;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.sax.SAXSource;import javax.xml.transform.stream.StreamSource;import javax.xml.transform.Source;import javax.xml.transform.TransformerException;import org.w3c.dom.Node;import org.apache.xml.utils.SystemIDResolver;/** * TransformerFactory class for xsl:include markup. * @see <a href="http://www.w3.org/TR/xslt#dtd">XSLT DTD</a> * @see <a href="http://www.w3.org/TR/xslt#include">include in XSLT Specification</a> */class ProcessorInclude extends XSLTElementProcessor{  /**   * The base URL of the XSL document.   * @serial   */  private String m_href = null;  /**   * Get the base identifier with which this stylesheet is associated.   *   * @return non-null reference to the href attribute string, or    *         null if setHref has not been called.   */  public String getHref()  {    return m_href;  }  /**   * Get the base identifier with which this stylesheet is associated.   *   * @param baseIdent Should be a non-null reference to a valid URL string.   */  public void setHref(String baseIdent)  {    // Validate?    m_href = baseIdent;  }  /**   * Get the stylesheet type associated with an included stylesheet   *   * @return the type of the stylesheet   */  protected int getStylesheetType()  {    return StylesheetHandler.STYPE_INCLUDE;  }  /**   * Get the error number associated with this type of stylesheet including itself   *   * @return the appropriate error number   */  protected String getStylesheetInclErr()  {    return XSLTErrorResources.ER_STYLESHEET_INCLUDES_ITSELF;  }  /**   * Receive notification of the start of an xsl:include element.   *   * @param handler The calling StylesheetHandler/TemplatesBuilder.   * @param uri The Namespace URI, or the empty string if the   *        element has no Namespace URI or if Namespace   *        processing is not being performed.   * @param localName The local name (without prefix), or the   *        empty string if Namespace processing is not being   *        performed.   * @param rawName The raw XML 1.0 name (with prefix), or the   *        empty string if raw names are not available.   * @param attributes The attributes attached to the element.  If   *        there are no attributes, it shall be an empty   *        Attributes object.   *   * @throws org.xml.sax.SAXException Any SAX exception, possibly   *            wrapping another exception.   */  public void startElement(          StylesheetHandler handler, String uri, String localName, String rawName, Attributes attributes)            throws org.xml.sax.SAXException  {    setPropertiesFromAttributes(handler, rawName, attributes, this);    try    {      String hrefUrl = SystemIDResolver.getAbsoluteURI(getHref(),                           handler.getBaseIdentifier());          if (handler.importStackContains(hrefUrl))      {        throw new org.xml.sax.SAXException(          XSLMessages.createMessage(          getStylesheetInclErr(), new Object[]{ hrefUrl }));  //"(StylesheetHandler) "+hrefUrl+" is directly or indirectly importing itself!");      }      handler.pushImportURL(hrefUrl);      int savedStylesheetType = handler.getStylesheetType();      handler.setStylesheetType(this.getStylesheetType());      handler.pushNewNamespaceSupport();      try      {        parse(handler, uri, localName, rawName, attributes);      }      finally      {        handler.setStylesheetType(savedStylesheetType);        handler.popImportURL();        handler.popNamespaceSupport();      }    }    catch(TransformerException te)    {      handler.error(te.getMessage(), te);    }  }  /**   * Set off a new parse for an included or imported stylesheet.  This will    * set the {@link StylesheetHandler} to a new state, and recurse in with    * a new set of parse events.  Once this function returns, the state of    * the StylesheetHandler should be restored.   *   * @param handler non-null reference to current StylesheetHandler that is constructing the Templates.   * @param uri The Namespace URI, which should be the XSLT namespace.   * @param localName The local name (without prefix), which should be "include" or "import".   * @param rawName The qualified name (with prefix).   * @param attributes The list of attributes on the xsl:include or xsl:import element.   *   * @throws org.xml.sax.SAXException Any SAX exception, possibly   *            wrapping another exception.   */  protected void parse(          StylesheetHandler handler, String uri, String localName, String rawName, Attributes attributes)            throws org.xml.sax.SAXException  {    TransformerFactoryImpl processor = handler.getStylesheetProcessor();    URIResolver uriresolver = processor.getURIResolver();    try    {      Source source = null;      if (null != uriresolver)      {        source = uriresolver.resolve(getHref(),                                     handler.getBaseIdentifier());        if (null != source && source instanceof DOMSource)        {          Node node = ((DOMSource)source).getNode();                    String systemId = source.getSystemId();          if (systemId == null)          {            systemId = SystemIDResolver.getAbsoluteURI(getHref(),                         handler.getBaseIdentifier());                      }                    TreeWalker walker = new TreeWalker(handler, new org.apache.xpath.DOM2Helper(), systemId);          try          {            walker.traverse(node);          }          catch(org.xml.sax.SAXException se)          {            throw new TransformerException(se);          }          return;        }      }            if(null == source)      {        String absURL = SystemIDResolver.getAbsoluteURI(getHref(),                          handler.getBaseIdentifier());        source = new StreamSource(absURL);      }            XMLReader reader = null;            if(source instanceof SAXSource)      {        SAXSource saxSource = (SAXSource)source;        reader = saxSource.getXMLReader(); // may be null      }            boolean isUserReader = (reader != null);            InputSource inputSource = SAXSource.sourceToInputSource(source);      if (null == reader)      {          // Use JAXP1.1 ( if possible )        try {          javax.xml.parsers.SAXParserFactory factory=                                                     javax.xml.parsers.SAXParserFactory.newInstance();          factory.setNamespaceAware( true );          javax.xml.parsers.SAXParser jaxpParser=                                                 factory.newSAXParser();          reader=jaxpParser.getXMLReader();                  } catch( javax.xml.parsers.ParserConfigurationException ex ) {          throw new org.xml.sax.SAXException( ex );        } catch( javax.xml.parsers.FactoryConfigurationError ex1 ) {            throw new org.xml.sax.SAXException( ex1.toString() );        }         catch( NoSuchMethodError ex2 )         {        }        catch (AbstractMethodError ame){}      }      if (null == reader)        reader = XMLReaderFactory.createXMLReader();      if (null != reader)      {        reader.setContentHandler(handler);        try        {          if(!isUserReader)            reader.setFeature("http://apache.org/xml/features/validation/dynamic",                              true);        }        catch(org.xml.sax.SAXException se) {}                handler.pushBaseIndentifier(inputSource.getSystemId());        try        {          reader.parse(inputSource);        }        finally        {          handler.popBaseIndentifier();        }      }    }    catch (IOException ioe)    {      handler.error(XSLTErrorResources.ER_IOEXCEPTION,                    new Object[]{ getHref() }, ioe);    }    catch(TransformerException te)    {      handler.error(te.getMessage(), te);    }  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?