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;
+ }
}
}