blob: f3ebf3ff5896630297ecb660a8e5abee81c11fec [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;
import org.apache.xalan.extensions.XPathFunctionResolverImpl;
import org.apache.xalan.extensions.ExtensionNamespaceContext;
import org.xml.sax.InputSource;
/**
* JAXP 1.3 XPath API sample.
*
* This sample shows how to use the sample XPathFunctionResolver to evaluate
* XPath expressions containing Java or EXSLT extension functions.
*
* To support extension functions in XPath expressions, you have to set an
* XPathFunctionResolver on the XPath object. You can provide your implementation
* of XPathFunctionResolver or use sample XPathFunctionResolver in
* org.apache.xalan.extensions.XPathFunctionResolverImpl, which supports
* the usage of Java and EXSLT extension functions.
*
* You also need to provide a NamespaceContext for the XPath evaluation. You
* can provide your own implementation of NamespaceContext, or use the sample
* implementation in org.apache.xalan.extensions.ExtensionNamespaceContext,
* which supports the following namespace prefix to URI mappings:
*
* java --> http://xml.apache.org/xalan/java
* exslt --> http://exslt.org/common
* math --> http://exslt.org/math
* set --> http://exslt.org/sets
* str --> http://exslt.org/strings
* dyn --> http://exslt.org/dynamic
* datetime --> http://exslt.org/dates-and-times
*
* To run this sample, you have to put the directory containing ExtensionTest.class
* on your classpath.
*/
public class ExtensionFunctionResolver
{
// An XPath expression containing an EXSLT extension function call.
public static final String EXPR1 = "math:max(/doc/num)";
// An XPath expression containing a Java extension function call.
// You have to compile the Java source file ExtensionTest.java and put
// the directory containing ExtensionTest.class on your classpath.
public static final String EXPR2 = "java:ExtensionTest.test('Bob')";
public static void main(String[] args) throws Exception
{
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
// set the NamespaceContext to
// org.apache.xalan.extensions.ExtensionNamespaceContext
xpath.setNamespaceContext(new ExtensionNamespaceContext());
// set the XPathFunctionResolver to
// org.apache.xalan.extensions.XPathFunctionResolverImpl
xpath.setXPathFunctionResolver(new XPathFunctionResolverImpl());
Object result = null;
// Evaluate the XPath expression "math:max(/doc/num)" against
// the input document numlist.xml
InputSource context = new InputSource("numlist.xml");
result = xpath.evaluate(EXPR1, context, XPathConstants.NUMBER);
System.out.println(EXPR1 + " = " + result);
// Evaluate the XPath expression "java:ExtensionTest.test('Bob')"
result = xpath.evaluate(EXPR2, context, XPathConstants.STRING);
System.out.println(EXPR2 + " = " + result);
}
}