You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by ga...@locus.apache.org on 2000/11/28 18:25:52 UTC

cvs commit: xml-xalan/java/src/org/apache/xpath/functions FuncExtElementAvailable.java

garyp       00/11/28 09:25:52

  Modified:    java/src/org/apache/xalan/processor ProcessorLRE.java
                        ProcessorStylesheetElement.java XSLTElementDef.java
                        XSLTSchema.java
               java/src/org/apache/xalan/templates StylesheetRoot.java
               java/src/org/apache/xpath/functions
                        FuncExtElementAvailable.java
  Log:
  Implement element-available for built-in elements.
  
  Revision  Changes    Path
  1.15      +1 -1      xml-xalan/java/src/org/apache/xalan/processor/ProcessorLRE.java
  
  Index: ProcessorLRE.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/processor/ProcessorLRE.java,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- ProcessorLRE.java	2000/11/23 04:57:24	1.14
  +++ ProcessorLRE.java	2000/11/28 17:25:50	1.15
  @@ -121,7 +121,7 @@
           Stylesheet stylesheet;
           try
           {
  -          stylesheet = new StylesheetRoot();
  +          stylesheet = new StylesheetRoot(handler.getSchema());
           }
           catch(TransformerConfigurationException tfe)
           {
  
  
  
  1.7       +1 -1      xml-xalan/java/src/org/apache/xalan/processor/ProcessorStylesheetElement.java
  
  Index: ProcessorStylesheetElement.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/processor/ProcessorStylesheetElement.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- ProcessorStylesheetElement.java	2000/11/22 23:25:55	1.6
  +++ ProcessorStylesheetElement.java	2000/11/28 17:25:50	1.7
  @@ -103,7 +103,7 @@
         {
           try
           {
  -          stylesheet = new StylesheetRoot();
  +          stylesheet = new StylesheetRoot(handler.getSchema());
           }
           catch(TransformerConfigurationException tfe)
           {
  
  
  
  1.9       +10 -1     xml-xalan/java/src/org/apache/xalan/processor/XSLTElementDef.java
  
  Index: XSLTElementDef.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/processor/XSLTElementDef.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- XSLTElementDef.java	2000/11/22 23:26:00	1.8
  +++ XSLTElementDef.java	2000/11/28 17:25:50	1.9
  @@ -59,6 +59,7 @@
   import org.xml.sax.ContentHandler;
   
   import org.apache.xalan.templates.Constants;
  +import org.apache.xml.utils.QName;
   
   /**
    * This class defines the allowed structure for an element in a XSLT stylesheet,
  @@ -86,12 +87,20 @@
      * @param contentHandler The element processor for this element.
      * @param classObject The class of the object that this element def should produce.
      */
  -  XSLTElementDef(String namespace, String name, String nameAlias,
  +  XSLTElementDef(XSLTSchema schema, String namespace, String name, String nameAlias,
                    XSLTElementDef[] elements, XSLTAttributeDef[] attributes,
                    XSLTElementProcessor contentHandler, Class classObject)
     {
       build(namespace, name, nameAlias, elements, attributes, contentHandler,
             classObject);
  +    if ( (null != namespace)
  +    &&  (namespace.equals(Constants.S_XSLNAMESPACEURL)
  +        || namespace.equals(Constants.S_BUILTIN_EXTENSIONS_URL)) )
  +    {
  +      schema.addAvailableElement(new QName(namespace, name));
  +      if(null != nameAlias)
  +        schema.addAvailableElement(new QName(namespace, nameAlias));
  +    } 
     }
   
     /**
  
  
  
  1.13      +69 -30    xml-xalan/java/src/org/apache/xalan/processor/XSLTSchema.java
  
  Index: XSLTSchema.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/processor/XSLTSchema.java,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- XSLTSchema.java	2000/11/16 20:51:29	1.12
  +++ XSLTSchema.java	2000/11/28 17:25:50	1.13
  @@ -56,7 +56,9 @@
    */
   package org.apache.xalan.processor;
   
  +import java.util.Hashtable;
   import org.apache.xalan.templates.*;
  +import org.apache.xml.utils.QName;
   
   /**
    * This class defines the allowed structure for a stylesheet, and the
  @@ -239,14 +241,14 @@
       XSLTAttributeDef xslVersionAttr =
         new XSLTAttributeDef(Constants.S_XSLNAMESPACEURL, "version",
                              XSLTAttributeDef.T_NMTOKEN, false);
  -    XSLTElementDef charData = new XSLTElementDef(null, "text()",
  +    XSLTElementDef charData = new XSLTElementDef(this, null, "text()",
                                   null /*alias */, null /* elements */, null,  /* attributes */
                                   new ProcessorCharacters(),
                                   ElemTextLiteral.class /* class object */);
   
       charData.setType(XSLTElementDef.T_PCDATA);
   
  -    XSLTElementDef whiteSpaceOnly = new XSLTElementDef(null, "text()",
  +    XSLTElementDef whiteSpaceOnly = new XSLTElementDef(this, null, "text()",
                                         null /*alias */, null /* elements */,
                                         null,  /* attributes */
                                         null,
  @@ -263,7 +265,7 @@
       XSLTElementDef[] templateElementsAndParams = new XSLTElementDef[22];
       XSLTElementDef[] templateElementsAndSort = new XSLTElementDef[22];
       XSLTElementDef[] charTemplateElements = new XSLTElementDef[15];
  -    XSLTElementDef resultElement = new XSLTElementDef(null, "*",
  +    XSLTElementDef resultElement = new XSLTElementDef(this, null, "*",
                                        null /*alias */,
                                        templateElementsAndParams /* elements */,
                                        new XSLTAttributeDef[]{
  @@ -275,7 +277,7 @@
                                          resultAttr }, new ProcessorLRE(),
                                                        ElemLiteralResult.class /* class object */);
       XSLTElementDef unknownElement =
  -      new XSLTElementDef(null, "unknown", null /*alias */,
  +      new XSLTElementDef(this, null, "unknown", null /*alias */,
                            templateElementsAndParams /* elements */,
                            new XSLTAttributeDef[]{ xslExcludeResultPrefixesAttr,
                                                    xslExtensionElementPrefixesAttr,
  @@ -285,18 +287,18 @@
                                                    resultAttr }, new ProcessorUnknown(),
                                                                  ElemUnknown.class /* class object */);
       XSLTElementDef xslValueOf =
  -      new XSLTElementDef(Constants.S_XSLNAMESPACEURL, "value-of",
  +      new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "value-of",
                            null /*alias */, null /* elements */,
                            new XSLTAttributeDef[]{ selectAttrRequired,
                                                    disableOutputEscapingAttr }, new ProcessorTemplateElem(),
                                                                                 ElemValueOf.class /* class object */);
  -    XSLTElementDef xslCopyOf = new XSLTElementDef(Constants.S_XSLNAMESPACEURL,
  +    XSLTElementDef xslCopyOf = new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL,
                                    "copy-of", null /*alias */,
                                    null /* elements */,
                                    new XSLTAttributeDef[]{ selectAttrRequired },
                                    new ProcessorTemplateElem(),
                                    ElemCopyOf.class /* class object */);
  -    XSLTElementDef xslNumber = new XSLTElementDef(Constants.S_XSLNAMESPACEURL,
  +    XSLTElementDef xslNumber = new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL,
                                    "number", null /*alias */,
                                    null /* elements */,
                                    new XSLTAttributeDef[]{ levelAttr,
  @@ -312,7 +314,7 @@
   
       // <!-- xsl:sort cannot occur after any other elements or
       // any non-whitespace character -->
  -    XSLTElementDef xslSort = new XSLTElementDef(Constants.S_XSLNAMESPACEURL,
  +    XSLTElementDef xslSort = new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL,
                                                   "sort", null /*alias */,
                                                   null /* elements */,
                                                   new XSLTAttributeDef[]{
  @@ -323,31 +325,31 @@
                                                     caseOrderAttr }, new ProcessorTemplateElem(),
                                                                      ElemSort.class /* class object */);
       XSLTElementDef xslWithParam =
  -      new XSLTElementDef(Constants.S_XSLNAMESPACEURL, "with-param",
  +      new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "with-param",
                            null /*alias */, templateElements /* elements */,  // %template;>
                                       new XSLTAttributeDef[]{ nameAttrRequired,
                                                               selectAttrOpt }, new ProcessorTemplateElem(),
                                                                                ElemWithParam.class /* class object */);
       XSLTElementDef xslApplyTemplates =
  -      new XSLTElementDef(Constants.S_XSLNAMESPACEURL, "apply-templates",
  +      new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "apply-templates",
                            null /*alias */, new XSLTElementDef[]{ xslSort,
                                                                   xslWithParam } /* elements */, new XSLTAttributeDef[]{
                                                                     selectAttrDefNode,
                                                                     modeAttr }, new ProcessorTemplateElem(),
                                                                                 ElemApplyTemplates.class /* class object */);
       XSLTElementDef xslApplyImports =
  -      new XSLTElementDef(Constants.S_XSLNAMESPACEURL, "apply-imports",
  +      new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "apply-imports",
                            null /*alias */, null /* elements */,
                            new XSLTAttributeDef[]{},
                            new ProcessorTemplateElem(),
                            ElemApplyImport.class /* class object */);
       XSLTElementDef xslForEach =
  -      new XSLTElementDef(Constants.S_XSLNAMESPACEURL, "for-each",
  +      new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "for-each",
                            null /*alias */, templateElementsAndSort,  // (#PCDATA %instructions; %result-elements; | xsl:sort)*
                                     new XSLTAttributeDef[]{ selectAttrRequired,
                                                             spaceAttr }, new ProcessorTemplateElem(),
                                                                          ElemForEach.class /* class object */);
  -    XSLTElementDef xslIf = new XSLTElementDef(Constants.S_XSLNAMESPACEURL,
  +    XSLTElementDef xslIf = new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL,
                                                 "if", null /*alias */,
                                                 templateElements /* elements */,  // %template;
                                                 new XSLTAttributeDef[]{
  @@ -355,59 +357,59 @@
                                                   spaceAttr }, new ProcessorTemplateElem(),
                                                                ElemIf.class /* class object */);
       XSLTElementDef xslWhen =
  -      new XSLTElementDef(Constants.S_XSLNAMESPACEURL, "when",
  +      new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "when",
                            null /*alias */, templateElements /* elements */,  // %template;>
                                                   new XSLTAttributeDef[]{
                                                     testAttrRequired,
                                                     spaceAttr }, new ProcessorTemplateElem(),
                                                                  ElemWhen.class /* class object */);
       XSLTElementDef xslOtherwise =
  -      new XSLTElementDef(Constants.S_XSLNAMESPACEURL, "otherwise",
  +      new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "otherwise",
                            null /*alias */, templateElements /* elements */,  // %template;>
                                       new XSLTAttributeDef[]{ spaceAttr },
                                       new ProcessorTemplateElem(),
                                       ElemOtherwise.class /* class object */);
  -    XSLTElementDef xslChoose = new XSLTElementDef(Constants.S_XSLNAMESPACEURL,
  +    XSLTElementDef xslChoose = new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL,
                                    "choose", null /*alias */,
                                    new XSLTElementDef[]{ xslWhen,
                                                          xslOtherwise } /* elements */, new XSLTAttributeDef[]{ spaceAttr },
                                                                                         new ProcessorTemplateElem(),
                                                                                         ElemChoose.class /* class object */);
       XSLTElementDef xslAttribute =
  -      new XSLTElementDef(Constants.S_XSLNAMESPACEURL, "attribute",
  +      new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "attribute",
                            null /*alias */, charTemplateElements /* elements */,  // %char-template;>
                                       new XSLTAttributeDef[]{ nameAVTRequired,
                                                               namespaceAVTOpt,
                                                               spaceAttr }, new ProcessorTemplateElem(),
                                                                            ElemAttribute.class /* class object */);
       XSLTElementDef xslCallTemplate =
  -      new XSLTElementDef(Constants.S_XSLNAMESPACEURL, "call-template",
  +      new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "call-template",
                            null /*alias */,
                            new XSLTElementDef[]{ xslWithParam } /* elements */,
                            new XSLTAttributeDef[]{ nameAttrRequired },
                            new ProcessorTemplateElem(),
                            ElemCallTemplate.class /* class object */);
       XSLTElementDef xslVariable =
  -      new XSLTElementDef(Constants.S_XSLNAMESPACEURL, "variable",
  +      new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "variable",
                            null /*alias */, templateElements /* elements */,  // %template;>
                                      new XSLTAttributeDef[]{ nameAttrRequired,
                                                              selectAttrOpt }, new ProcessorTemplateElem(),
                                                                               ElemVariable.class /* class object */);
  -    XSLTElementDef xslParam = new XSLTElementDef(Constants.S_XSLNAMESPACEURL,
  +    XSLTElementDef xslParam = new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL,
                                   "param", null /*alias */,
                                   templateElements /* elements */,  // %template;>
                                   new XSLTAttributeDef[]{ nameAttrRequired,
                                                           selectAttrOpt }, new ProcessorTemplateElem(),
                                                                            ElemParam.class /* class object */);
       XSLTElementDef xslText =
  -      new XSLTElementDef(Constants.S_XSLNAMESPACEURL, "text",
  +      new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "text",
                            null /*alias */,
                            new XSLTElementDef[]{ charData } /* elements */,
                            new XSLTAttributeDef[]{ disableOutputEscapingAttr },
                            new ProcessorText(),
                            ElemText.class /* class object */);
       XSLTElementDef xslProcessingInstruction =
  -      new XSLTElementDef(Constants.S_XSLNAMESPACEURL,
  +      new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL,
                            "processing-instruction", null /*alias */,
                            charTemplateElements /* elements */,  // %char-template;>
                                                   new XSLTAttributeDef[]{
  @@ -415,7 +417,7 @@
                                                     spaceAttr }, new ProcessorTemplateElem(),
                                                                  ElemPI.class /* class object */);
       XSLTElementDef xslElement =
  -      new XSLTElementDef(Constants.S_XSLNAMESPACEURL, "element",
  +      new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "element",
                            null /*alias */, templateElements /* elements */,  // %template;
                                     new XSLTAttributeDef[]{ nameAVTRequired,
                                                             namespaceAVTOpt,
  @@ -423,26 +425,26 @@
                                                             spaceAttr }, new ProcessorTemplateElem(),
                                                                          ElemElement.class /* class object */);
       XSLTElementDef xslComment =
  -      new XSLTElementDef(Constants.S_XSLNAMESPACEURL, "comment",
  +      new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "comment",
                            null /*alias */, charTemplateElements /* elements */,  // %char-template;>
                                     new XSLTAttributeDef[]{ spaceAttr },
                                     new ProcessorTemplateElem(),
                                     ElemComment.class /* class object */);
       XSLTElementDef xslCopy =
  -      new XSLTElementDef(Constants.S_XSLNAMESPACEURL, "copy",
  +      new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "copy",
                            null /*alias */, templateElements /* elements */,  // %template;>
                                                   new XSLTAttributeDef[]{
                                                     spaceAttr,
                                                     useAttributeSetsAttr }, new ProcessorTemplateElem(),
                                                                             ElemCopy.class /* class object */);
       XSLTElementDef xslMessage =
  -      new XSLTElementDef(Constants.S_XSLNAMESPACEURL, "message",
  +      new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "message",
                            null /*alias */, templateElements /* elements */,  // %template;>
                                     new XSLTAttributeDef[]{terminateAttr},
                                     new ProcessorTemplateElem(),
                                     ElemMessage.class /* class object */);
       XSLTElementDef xslFallback =
  -      new XSLTElementDef(Constants.S_XSLNAMESPACEURL, "fallback",
  +      new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "fallback",
                            null /*alias */, templateElements /* elements */,  // %template;>
                                      new XSLTAttributeDef[]{ spaceAttr },
                                      new ProcessorTemplateElem(),
  @@ -509,14 +511,14 @@
       charTemplateElements[i++] = xslMessage;
       charTemplateElements[i++] = xslFallback;
   
  -    XSLTElementDef importDef = new XSLTElementDef(Constants.S_XSLNAMESPACEURL,
  +    XSLTElementDef importDef = new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL,
                                    "import", null /*alias */,
                                    null /* elements */,
                                    new XSLTAttributeDef[]{ hrefAttr },  // EMPTY
                                    new ProcessorImport(),
                                    null /* class object */);
       XSLTElementDef includeDef =
  -      new XSLTElementDef(Constants.S_XSLNAMESPACEURL, "include",
  +      new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "include",
                            null /*alias */, null /* elements */,  // EMPTY
                                     new XSLTAttributeDef[]{ hrefAttr },
                                     new ProcessorInclude(),
  @@ -527,6 +529,7 @@
                                                                 whiteSpaceOnly,
                                                                 unknownElement,
                                                                 new XSLTElementDef(
  +                                                                this,
                                                                   Constants.S_XSLNAMESPACEURL,
                                                                   "strip-space",
                                                                   null /*alias */,
  @@ -535,6 +538,7 @@
                                                                                                    new ProcessorStripSpace(),
                                                                                                    null /* class object */),
                                                                 new XSLTElementDef(
  +                                                                this,
                                                                   Constants.S_XSLNAMESPACEURL,
                                                                   "preserve-space",
                                                                   null /*alias */,
  @@ -543,6 +547,7 @@
                                                                                    new ProcessorPreserveSpace(),
                                                                                    null /* class object */),
                                                                 new XSLTElementDef(
  +                                                                this,
                                                                   Constants.S_XSLNAMESPACEURL,
                                                                   "output",
                                                                   null /*alias */,
  @@ -558,6 +563,7 @@
                                                                                      cdataSectionElementsAttr,
                                                                                      indentAttr,
                                                                                      mediaTypeAttr }, new ProcessorOutputElem(), null /* class object */), new XSLTElementDef(
  +                                                                                     this,
                                                                                        Constants.S_XSLNAMESPACEURL,
                                                                                        "key",
                                                                                        null /*alias */,
  @@ -566,6 +572,7 @@
                                                                                                                                                                                                                             matchAttrRequired,
                                                                                                                                                                                                                             useAttr }, new ProcessorKey(), null /* class object */),
                                                                 new XSLTElementDef(
  +                                                                this,
                                                                   Constants.S_XSLNAMESPACEURL,
                                                                   "decimal-format",
                                                                   null /*alias */,
  @@ -584,6 +591,7 @@
                                                                                      patternSeparatorAttr }, new ProcessorDecimalFormat(),
                                                                                                              null /* class object */),
                                                                 new XSLTElementDef(
  +                                                                this,
                                                                   Constants.S_XSLNAMESPACEURL,
                                                                   "attribute-set",
                                                                   null /*alias */,
  @@ -594,6 +602,7 @@
                                                                     useAttributeSetsAttr }, new ProcessorAttributeSet(),
                                                                                             null /* class object */),
                                                                 new XSLTElementDef(
  +                                                                this,
                                                                   Constants.S_XSLNAMESPACEURL,
                                                                   "variable",
                                                                   null /*alias */,
  @@ -603,6 +612,7 @@
                                                                     selectAttrOpt }, new ProcessorGlobalVariableDecl(),
                                                                                      ElemVariable.class /* class object */),
                                                                 new XSLTElementDef(
  +                                                                this,
                                                                   Constants.S_XSLNAMESPACEURL,
                                                                   "param",
                                                                   null /*alias */,
  @@ -612,6 +622,7 @@
                                                                     selectAttrOpt }, new ProcessorGlobalParamDecl(),
                                                                                      ElemParam.class /* class object */),
                                                                 new XSLTElementDef(
  +                                                                this,
                                                                   Constants.S_XSLNAMESPACEURL,
                                                                   "template",
                                                                   null /*alias */,
  @@ -622,6 +633,7 @@
                                                                     priorityAttr,
                                                                     modeAttr,
                                                                     spaceAttr }, new ProcessorTemplate(), ElemTemplate.class /* class object */), new XSLTElementDef(
  +                                                                    this,
                                                                       Constants.S_XSLNAMESPACEURL,
                                                                       "namespace-alias",
                                                                       null /*alias */,
  @@ -629,11 +641,13 @@
                                                                                                                                                                                                                                                                                                                 new XSLTAttributeDef[]{ stylesheetPrefixAttr,
                                                                                                                                                                                                                                                                                                                                         resultPrefixAttr }, new ProcessorNamespaceAlias(), null /* class object */),
                                                                 new XSLTElementDef(
  +                                                                this,
                                                                   Constants.S_BUILTIN_EXTENSIONS_URL,
                                                                   "component",
                                                                   null /*alias */,
                                                                   new XSLTElementDef[]{
                                                                     new XSLTElementDef(
  +                                                                    this,
                                                                       Constants.S_BUILTIN_EXTENSIONS_URL,
                                                                       "script",
                                                                       null /*alias */,
  @@ -662,7 +676,7 @@
                                                XSLTAttributeDef.T_NMTOKEN,
                                                true);
       XSLTElementDef stylesheetElemDef =
  -      new XSLTElementDef(Constants.S_XSLNAMESPACEURL, "stylesheet",
  +      new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "stylesheet",
                            "transform", topLevelElements,
                            new XSLTAttributeDef[]{ extensionElementPrefixesAttr,
                                                    excludeResultPrefixesAttr,
  @@ -685,5 +699,30 @@
                                                                       new ProcessorStylesheetDoc(),  /* ContentHandler */
                                                                       null  /* class object */
                                                                         );
  +  }
  +
  +  /**
  +   * A hashtable of all available built-in elements for use by the element-available
  +   * function.
  +   */
  +  // TODO:  When we convert to Java2, this should be a Set.
  +  private Hashtable m_availElems = new Hashtable();
  +
  +  /**
  +   * Adds a new element name to the Hashtable of available elements.
  +   * @param elemName The name of the element to add to the Hashtable of available elements.
  +   */
  +  void addAvailableElement(QName elemName)
  +  {
  +    m_availElems.put(elemName, elemName);
  +  }
  +
  +  /**
  +   * Determines whether the passed element name is present in the list of available elements.
  +   * @param elemName The name of the element to look up.
  +   */
  +  public boolean elementAvailable(QName elemName)
  +  {
  +    return m_availElems.containsKey(elemName);
     }
   }
  
  
  
  1.24      +29 -2     xml-xalan/java/src/org/apache/xalan/templates/StylesheetRoot.java
  
  Index: StylesheetRoot.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/templates/StylesheetRoot.java,v
  retrieving revision 1.23
  retrieving revision 1.24
  diff -u -r1.23 -r1.24
  --- StylesheetRoot.java	2000/11/23 04:57:57	1.23
  +++ StylesheetRoot.java	2000/11/28 17:25:51	1.24
  @@ -74,6 +74,7 @@
   import org.apache.xalan.trace.*;
   import org.apache.xalan.res.XSLTErrorResources;
   import org.apache.xalan.res.XSLMessages;
  +import org.apache.xalan.processor.XSLTSchema;
   import org.apache.xalan.transformer.TransformerImpl;
   
   import javax.xml.transform.Transformer;
  @@ -92,8 +93,6 @@
   
     /**
      * Uses an XSL stylesheet document.
  -   * @param transformer  The XSLTProcessor implementation.
  -   * @param baseIdentifier The file name or URL for the XSL stylesheet.
      * @exception TransformerConfigurationException if the baseIdentifier can not be resolved to a URL.
      */
     public StylesheetRoot() throws TransformerConfigurationException
  @@ -116,6 +115,24 @@
     }
   
     /**
  +   * The schema used when creating this StylesheetRoot
  +   */
  +  private XSLTSchema m_schema;
  +
  +  /**
  +   * Creates a StylesheetRoot and retains a pointer to the schema used to create this
  +   * StylesheetRoot.  The schema may be needed later for an element-available() function call.
  +   * @exception TransformerConfigurationException if the baseIdentifier can not be resolved to a URL.
  +   */
  +  public StylesheetRoot(XSLTSchema schema) throws TransformerConfigurationException
  +  {
  +
  +    this();
  +    m_schema = schema;
  +
  +  }
  +
  +  /**
      * Tell if this is the root of the stylesheet tree.
      *
      * NEEDSDOC ($objectName$) @return
  @@ -123,6 +140,16 @@
     public boolean isRoot()
     {
       return true;
  +  }
  +
  +  /**
  +   * Get the schema associated with this StylesheetRoot
  +   *
  +   * @return the schema in effect when this StylesheetRoot was built
  +   */
  +  public XSLTSchema getSchema()
  +  {
  +    return m_schema;
     }
   
     //============== Templates Interface ================
  
  
  
  1.5       +44 -9     xml-xalan/java/src/org/apache/xpath/functions/FuncExtElementAvailable.java
  
  Index: FuncExtElementAvailable.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xpath/functions/FuncExtElementAvailable.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- FuncExtElementAvailable.java	2000/11/23 04:59:11	1.4
  +++ FuncExtElementAvailable.java	2000/11/28 17:25:52	1.5
  @@ -57,7 +57,10 @@
   package org.apache.xpath.functions;
   
   import org.apache.xml.utils.PrefixResolver;
  +import org.apache.xml.utils.QName;
   import org.apache.xalan.extensions.ExtensionsTable;
  +import org.apache.xalan.templates.Constants;
  +import org.apache.xalan.transformer.TransformerImpl;
   
   import org.w3c.dom.Node;
   
  @@ -86,17 +89,49 @@
     public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
     {
   
  +    String prefix;
  +    String namespace;
  +    String methName;
  +
       String fullName = m_arg0.execute(xctxt).str();
       int indexOfNSSep = fullName.indexOf(':');
  -    String prefix = (indexOfNSSep >= 0)
  -                    ? fullName.substring(0, indexOfNSSep) : "";
  -    String namespace =
  -      xctxt.getNamespaceContext().getNamespaceForPrefix(prefix);
  -    String methName = (indexOfNSSep < 0)
  -                      ? fullName : fullName.substring(indexOfNSSep + 1);
  -    ExtensionsTable etable = xctxt.getExtensionsTable();
   
  -    return etable.elementAvailable(namespace, methName)
  -           ? XBoolean.S_TRUE : XBoolean.S_FALSE;
  +    if (indexOfNSSep < 0)
  +    {
  +      prefix = "";
  +      namespace = Constants.S_XSLNAMESPACEURL;
  +      methName = fullName;
  +    }
  +    else
  +    {
  +      prefix = fullName.substring(0, indexOfNSSep);
  +      namespace = xctxt.getNamespaceContext().getNamespaceForPrefix(prefix);
  +      if (null == namespace)
  +        return XBoolean.S_FALSE;
  +      methName= fullName.substring(indexOfNSSep + 1);
  +    }
  +
  +    if (namespace.equals(Constants.S_XSLNAMESPACEURL)
  +    ||  namespace.equals(Constants.S_BUILTIN_EXTENSIONS_URL))
  +    {
  +      try
  +      {
  +        TransformerImpl transformer = (TransformerImpl) xctxt.getOwnerObject();
  +        return transformer.getStylesheet().getSchema().elementAvailable(
  +                                                            new QName(namespace, methName))
  +               ? XBoolean.S_TRUE : XBoolean.S_FALSE;
  +      }
  +      catch (Exception e)
  +      {
  +        return XBoolean.S_FALSE;
  +      }
  +    }
  +    else
  +    {
  +      ExtensionsTable etable = xctxt.getExtensionsTable();
  +
  +      return etable.elementAvailable(namespace, methName)
  +             ? XBoolean.S_TRUE : XBoolean.S_FALSE;
  +    }
     }
   }