コード例 #1
0
  /** 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;
        // _templates.addElement(template);
        getMode(template.getModeName()).addTemplate(template);
      }
      // xsl:attribute-set
      else if (element instanceof AttributeSet) {
        ((AttributeSet) element).translate(classGen, null);
      } else if (element instanceof Output) {
        // save the element for later to pass to compileConstructor
        Output output = (Output) element;
        if (output.enabled()) _lastOutputElement = output;
      } else {
        // Global variables and parameters are handled elsewhere.
        // Other top-level non-template elements are ignored. Literal
        // elements outside of templates will never be output.
      }
    }

    checkOutputMethod();
    processModes();
    compileModes(classGen);
    compileStaticInitializer(classGen);
    compileConstructor(classGen, _lastOutputElement);

    if (!getParser().errorsFound()) {
      getXSLTC().dumpClass(classGen.getJavaClass());
    }
  }