stylesheet.java

来自「JAVA的一些源码 JAVA2 STANDARD EDITION DEVELO」· Java 代码 · 共 1,413 行 · 第 1/4 页

JAVA
1,413
字号
     * Get the minimum of the precedence of this stylesheet, any stylesheet     * imported by this stylesheet and any include/import descendant of this     * stylesheet.     */    public int getMinimumDescendantPrecedence() {        if (_minimumDescendantPrecedence == -1) {            // Start with precedence of current stylesheet as a basis.            int min = getImportPrecedence();            // Recursively examine all imported/included stylesheets.            final int inclImpCount = (_includedStylesheets != null)                                          ? _includedStylesheets.size()                                          : 0;            for (int i = 0; i < inclImpCount; i++) {                int prec = ((Stylesheet)_includedStylesheets.elementAt(i))                                              .getMinimumDescendantPrecedence();                if (prec < min) {                    min = prec;                }            }            _minimumDescendantPrecedence = min;        }        return _minimumDescendantPrecedence;    }        public boolean checkForLoop(String systemId) {        // Return true if this stylesheet includes/imports itself        if (_systemId != null && _systemId.equals(systemId)) {            return true;        }        // Then check with any stylesheets that included/imported this one        if (_parentStylesheet != null)             return _parentStylesheet.checkForLoop(systemId);        // Otherwise OK        return false;    }        public void setParser(Parser parser) {        super.setParser(parser);        _name = makeStylesheetName("__stylesheet_");    }        public void setParentStylesheet(Stylesheet parent) {        _parentStylesheet = parent;    }        public Stylesheet getParentStylesheet() {        return _parentStylesheet;    }    public void setImportingStylesheet(Stylesheet parent) {        _importedFrom = parent;        parent.addIncludedStylesheet(this);    }    public void setIncludingStylesheet(Stylesheet parent) {        _includedFrom = parent;        parent.addIncludedStylesheet(this);    }    public void addIncludedStylesheet(Stylesheet child) {        if (_includedStylesheets == null) {            _includedStylesheets = new Vector();        }        _includedStylesheets.addElement(child);    }    public void setSystemId(String systemId) {        if (systemId != null) {            _systemId = SystemIDResolver.getAbsoluteURI(systemId);        }    }        public String getSystemId() {        return _systemId;    }    public void setSourceLoader(SourceLoader loader) {        _loader = loader;    }        public SourceLoader getSourceLoader() {        return _loader;    }    private QName makeStylesheetName(String prefix) {        return getParser().getQName(prefix+getXSLTC().nextStylesheetSerial());    }    /**     * Returns true if this stylesheet has global vars or params.     */    public boolean hasGlobals() {        return _globals.size() > 0;    }    /**     * Returns true if at least one template in the stylesheet has params     * defined. Uses the variable <code>_hasLocalParams</code> to cache the     * result.     */    public boolean hasLocalParams() {        if (_hasLocalParams == null) {            Vector templates = getAllValidTemplates();            final int n = templates.size();            for (int i = 0; i < n; i++) {                final Template template = (Template)templates.elementAt(i);                if (template.hasParams()) {                    _hasLocalParams = new Boolean(true);                    return true;                }            }            _hasLocalParams = new Boolean(false);            return false;        }        else {            return _hasLocalParams.booleanValue();        }    }    /**     * Adds a single prefix mapping to this syntax tree node.     * @param prefix Namespace prefix.     * @param uri Namespace URI.     */    protected void addPrefixMapping(String prefix, String uri) {        if (prefix.equals(EMPTYSTRING) && uri.equals(XHTML_URI)) return;        super.addPrefixMapping(prefix, uri);    }    /**     * Store extension URIs     */    private void extensionURI(String prefixes, SymbolTable stable) {        if (prefixes != null) {            StringTokenizer tokens = new StringTokenizer(prefixes);            while (tokens.hasMoreTokens()) {                final String prefix = tokens.nextToken();                final String uri = lookupNamespace(prefix);                if (uri != null) {                    _extensions.put(uri, prefix);                }            }        }    }    public boolean isExtension(String uri) {        return (_extensions.get(uri) != null);    }    public void excludeExtensionPrefixes(Parser parser) {        final SymbolTable stable = parser.getSymbolTable();        final String excludePrefixes = getAttribute("exclude-result-prefixes");        final String extensionPrefixes = getAttribute("extension-element-prefixes");                // Exclude XSLT uri         stable.excludeURI(Constants.XSLT_URI);        stable.excludeNamespaces(excludePrefixes);        stable.excludeNamespaces(extensionPrefixes);        extensionURI(extensionPrefixes, stable);    }    /**     * Parse the version and uri fields of the stylesheet and add an     * entry to the symbol table mapping the name <tt>__stylesheet_</tt>     * to an instance of this class.     */    public void parseContents(Parser parser) {        final SymbolTable stable = parser.getSymbolTable();        /*        // Make sure the XSL version set in this stylesheet        if ((_version == null) || (_version.equals(EMPTYSTRING))) {            reportError(this, parser, ErrorMsg.REQUIRED_ATTR_ERR,"version");        }        // Verify that the version is 1.0 and nothing else        else if (!_version.equals("1.0")) {            reportError(this, parser, ErrorMsg.XSL_VERSION_ERR, _version);        }        */        // Add the implicit mapping of 'xml' to the XML namespace URI        addPrefixMapping("xml", "http://www.w3.org/XML/1998/namespace");        // Report and error if more than one stylesheet defined        final Stylesheet sheet = stable.addStylesheet(_name, this);        if (sheet != null) {            // Error: more that one stylesheet defined            ErrorMsg err = new ErrorMsg(ErrorMsg.MULTIPLE_STYLESHEET_ERR,this);            parser.reportError(Constants.ERROR, err);        }        // If this is a simplified stylesheet we must create a template that        // grabs the root node of the input doc ( <xsl:template match="/"/> ).        // This template needs the current element (the one passed to this        // method) as its only child, so the Template class has a special        // method that handles this (parseSimplified()).        if (_simplified) {            stable.excludeURI(XSLT_URI);            Template template = new Template();            template.parseSimplified(this, parser);        }        // Parse the children of this node        else {            parseOwnChildren(parser);        }    }    /**     * Parse all direct children of the <xsl:stylesheet/> element.     */    public final void parseOwnChildren(Parser parser) {        final Vector contents = getContents();        final int count = contents.size();        // We have to scan the stylesheet element's top-level elements for        // variables and/or parameters before we parse the other elements        for (int i = 0; i < count; i++) {            SyntaxTreeNode child = (SyntaxTreeNode)contents.elementAt(i);            if ((child instanceof VariableBase) ||                (child instanceof NamespaceAlias)) {                parser.getSymbolTable().setCurrentNode(child);                child.parseContents(parser);            }        }        // Now go through all the other top-level elements...        for (int i = 0; i < count; i++) {            SyntaxTreeNode child = (SyntaxTreeNode)contents.elementAt(i);            if (!(child instanceof VariableBase) &&                 !(child instanceof NamespaceAlias)) {                parser.getSymbolTable().setCurrentNode(child);                child.parseContents(parser);            }            // All template code should be compiled as methods if the            // <xsl:apply-imports/> element was ever used in this stylesheet            if (!_templateInlining && (child instanceof Template)) {                Template template = (Template)child;                String name = "template$dot$" + template.getPosition();                template.setName(parser.getQName(name));            }        }    }    public void processModes() {        if (_defaultMode == null)            _defaultMode = new Mode(null, this, Constants.EMPTYSTRING);        _defaultMode.processPatterns(_keys);        final Enumeration modes = _modes.elements();        while (modes.hasMoreElements()) {            final Mode mode = (Mode)modes.nextElement();            mode.processPatterns(_keys);        }    }            private void compileModes(ClassGenerator classGen) {        _defaultMode.compileApplyTemplates(classGen);        final Enumeration modes = _modes.elements();        while (modes.hasMoreElements()) {            final Mode mode = (Mode)modes.nextElement();            mode.compileApplyTemplates(classGen);        }    }    public Mode getMode(QName modeName) {        if (modeName == null) {            if (_defaultMode == null) {                _defaultMode = new Mode(null, this, Constants.EMPTYSTRING);            }            return _defaultMode;        }        else {            Mode mode = (Mode)_modes.get(modeName);            if (mode == null) {                final String suffix = Integer.toString(_nextModeSerial++);                _modes.put(modeName, mode = new Mode(modeName, this, suffix));            }            return mode;        }    }    /**     * Type check all the children of this node.     */    public Type typeCheck(SymbolTable stable) throws TypeCheckError {        final int count = _globals.size();        for (int i = 0; i < count; i++) {            final VariableBase var = (VariableBase)_globals.elementAt(i);            var.typeCheck(stable);        }        return typeCheckContents(stable);    }    /**     * Translate the stylesheet into JVM bytecodes.      */    public void translate(ClassGenerator classGen, MethodGenerator methodGen) {        translate();    }    private void addDOMField(ClassGenerator classGen) {        final FieldGen fgen = new FieldGen(ACC_PUBLIC,                                           Util.getJCRefType(DOM_INTF_SIG),                                           DOM_FIELD,                                           classGen.getConstantPool());        classGen.addField(fgen.getField());    }        /**     * Add a static field     */    private void addStaticField(ClassGenerator classGen, String type,                                String name)    {        final FieldGen fgen = new FieldGen(ACC_PROTECTED|ACC_STATIC,                                           Util.getJCRefType(type),                                           name,                                           classGen.getConstantPool());        classGen.addField(fgen.getField());    }    /**     * Translate the stylesheet into JVM bytecodes.      */    public void translate() {        _className = getXSLTC().getClassName();        // Define a new class by extending TRANSLET_CLASS        final ClassGenerator classGen =            new ClassGenerator(_className,                               TRANSLET_CLASS,                               Constants.EMPTYSTRING,                               ACC_PUBLIC | ACC_SUPER,                               null, this);                addDOMField(classGen);        // Compile transform() to initialize parameters, globals & output        // and run the transformation        compileTransform(classGen);        // Translate all non-template elements and filter out all templates        final Enumeration elements = elements();        while (elements.hasMoreElements()) {            Object element = elements.nextElement();            // xsl:template            if (element instanceof Template) {                // Separate templates by modes                final Template template = (Template)element;

⌨️ 快捷键说明

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