1 /* 2 * $Header$ 3 * $Revision$ 4 * $Date$ 5 * 6 * ==================================================================== 7 * 8 * Copyright 2000-2002 bob mcwhirter & James Strachan. 9 * All rights reserved. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions are 13 * met: 14 * 15 * * Redistributions of source code must retain the above copyright 16 * notice, this list of conditions and the following disclaimer. 17 * 18 * * Redistributions in binary form must reproduce the above copyright 19 * notice, this list of conditions and the following disclaimer in the 20 * documentation and/or other materials provided with the distribution. 21 * 22 * * Neither the name of the Jaxen Project nor the names of its 23 * contributors may be used to endorse or promote products derived 24 * from this software without specific prior written permission. 25 * 26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 27 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 28 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 29 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 30 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 31 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 32 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 33 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 34 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 35 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 36 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 37 * 38 * ==================================================================== 39 * This software consists of voluntary contributions made by many 40 * individuals on behalf of the Jaxen Project and was originally 41 * created by bob mcwhirter <bob@werken.com> and 42 * James Strachan <jstrachan@apache.org>. For more information on the 43 * Jaxen Project, please see <http://www.jaxen.org/>. 44 * 45 * $Id$ 46 */ 47 48 49 package org.jaxen.function; 50 51 import java.util.List; 52 53 import org.jaxen.Context; 54 import org.jaxen.Function; 55 import org.jaxen.FunctionCallException; 56 import org.jaxen.Navigator; 57 58 /** 59 * <p> 60 * <b>4.1</b> 61 * <code><i>string</i> namespace-uri(<i>node-set?</i>)</code> 62 * </p> 63 * 64 * <blockquote cite="http://www.w3.org/TR/xpath"> 65 * <p> 66 * The <b>namespace-uri</b> 67 * function returns the namespace URI of the <a 68 * href="https://www.w3.org/TR/xpath#dt-expanded-name" target="_top">expanded-name</a> of the node in the 69 * argument node-set that is first in <a 70 * href="https://www.w3.org/TR/xpath#dt-document-order" target="_top">document order</a>. If the argument 71 * node-set is empty, the first node has no <a 72 * href="https://www.w3.org/TR/xpath#dt-expanded-name" target="_top">expanded-name</a>, or the namespace URI of 73 * the <a href="https://www.w3.org/TR/xpath#dt-expanded-name" target="_top">expanded-name</a> is null, an empty 74 * string is returned. If the argument is omitted, it defaults to a 75 * node-set with the context node as its only member. 76 * </p> 77 * 78 * <blockquote> <b>NOTE: </b>The string returned by the <b>namespace-uri</b> function will 79 * be empty except for element nodes and attribute nodes.</blockquote> 80 * 81 * </blockquote> 82 * 83 * @author bob mcwhirter (bob @ werken.com) 84 * @see <a href="https://www.w3.org/TR/xpath#function-namespace-uri" 85 * target="_top">Section 4.1 of the XPath Specification</a> 86 */ 87 public class NamespaceUriFunction implements Function 88 { 89 90 /** 91 * Create a new <code>NamespaceUriFunction</code> object. 92 */ 93 public NamespaceUriFunction() {} 94 95 /** 96 * Returns the namespace URI of the specified node or the namespace URI of the context node if 97 * no arguments are provided. 98 * 99 * @param context the context at the point in the 100 * expression where the function is called 101 * @param args a <code>List</code> containing zero or one items 102 * 103 * @return a <code>String</code> containing the namespace URI 104 * 105 * @throws FunctionCallException if <code>args</code> has more than one item 106 */ 107 public Object call(Context context, 108 List args) throws FunctionCallException 109 { 110 if (args.size() == 0) 111 { 112 return evaluate( context.getNodeSet(), 113 context.getNavigator() ); 114 } 115 116 if ( args.size() == 1 ) 117 { 118 return evaluate( args, 119 context.getNavigator() ); 120 } 121 122 throw new FunctionCallException( "namespace-uri() requires zero or one argument." ); 123 } 124 125 /** 126 * Returns the namespace URI of <code>list.get(0)</code> 127 * 128 * @param list a list of nodes 129 * @param nav the <code>Navigator</code> used to retrieve the namespace 130 * 131 * @return the namespace URI of <code>list.get(0)</code> 132 * 133 * @throws FunctionCallException if <code>list.get(0)</code> is not a node 134 */ 135 public static String evaluate(List list, 136 Navigator nav) throws FunctionCallException 137 { 138 if ( ! list.isEmpty() ) 139 { 140 Object first = list.get(0); 141 142 if ( first instanceof List ) 143 { 144 return evaluate( (List) first, 145 nav ); 146 } 147 else if ( nav.isElement( first ) ) 148 { 149 return nav.getElementNamespaceUri( first ); 150 } 151 else if ( nav.isAttribute( first ) ) 152 { 153 String uri = nav.getAttributeNamespaceUri( first ); 154 if (uri == null) return ""; 155 return uri; 156 } 157 else if ( nav.isProcessingInstruction( first ) ) 158 { 159 return ""; 160 } 161 else if ( nav.isNamespace( first ) ) 162 { 163 return ""; 164 } 165 else if ( nav.isDocument( first ) ) 166 { 167 return ""; 168 } 169 else if ( nav.isComment( first ) ) 170 { 171 return ""; 172 } 173 else if ( nav.isText( first ) ) 174 { 175 return ""; 176 } 177 else { 178 throw new FunctionCallException( 179 "The argument to the namespace-uri function must be a node-set"); 180 } 181 182 } 183 184 return ""; 185 186 } 187 } 188