001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the "License"); 007 * you may not use this file except in compliance with the License. 008 * You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018 /* 019 * $Id: NodeInfo.java 468639 2006-10-28 06:52:33Z minchau $ 020 */ 021 022 package org.apache.xalan.lib; 023 024 import javax.xml.transform.SourceLocator; 025 026 import org.apache.xalan.extensions.ExpressionContext; 027 import org.apache.xml.dtm.ref.DTMNodeProxy; 028 029 import org.w3c.dom.Node; 030 import org.w3c.dom.NodeList; 031 032 /** 033 * <code>NodeInfo</code> defines a set of XSLT extension functions to be 034 * used from stylesheets. 035 * 036 * @author <a href="mailto:ovidiu@cup.hp.com">Ovidiu Predescu</a> 037 * @since May 24, 2001 038 */ 039 public class NodeInfo 040 { 041 /** 042 * <code>systemId</code> returns the system id of the current 043 * context node. 044 * 045 * @param context an <code>ExpressionContext</code> value 046 * @return a <code>String</code> value 047 */ 048 public static String systemId(ExpressionContext context) 049 { 050 Node contextNode = context.getContextNode(); 051 int nodeHandler = ((DTMNodeProxy)contextNode).getDTMNodeNumber(); 052 SourceLocator locator = ((DTMNodeProxy)contextNode).getDTM() 053 .getSourceLocatorFor(nodeHandler); 054 055 if (locator != null) 056 return locator.getSystemId(); 057 else 058 return null; 059 } 060 061 /** 062 * <code>systemId</code> returns the system id of the node passed as 063 * argument. If a node set is passed as argument, the system id of 064 * the first node in the set is returned. 065 * 066 * @param nodeList a <code>NodeList</code> value 067 * @return a <code>String</code> value 068 */ 069 public static String systemId(NodeList nodeList) 070 { 071 if (nodeList == null || nodeList.getLength() == 0) 072 return null; 073 074 Node node = nodeList.item(0); 075 int nodeHandler = ((DTMNodeProxy)node).getDTMNodeNumber(); 076 SourceLocator locator = ((DTMNodeProxy)node).getDTM() 077 .getSourceLocatorFor(nodeHandler); 078 079 if (locator != null) 080 return locator.getSystemId(); 081 else 082 return null; 083 } 084 085 /** 086 * <code>publicId</code> returns the public identifier of the current 087 * context node. 088 * 089 * Xalan does not currently record this value, and will return null. 090 * 091 * @param context an <code>ExpressionContext</code> value 092 * @return a <code>String</code> value 093 */ 094 public static String publicId(ExpressionContext context) 095 { 096 Node contextNode = context.getContextNode(); 097 int nodeHandler = ((DTMNodeProxy)contextNode).getDTMNodeNumber(); 098 SourceLocator locator = ((DTMNodeProxy)contextNode).getDTM() 099 .getSourceLocatorFor(nodeHandler); 100 101 if (locator != null) 102 return locator.getPublicId(); 103 else 104 return null; 105 } 106 107 /** 108 * <code>publicId</code> returns the public identifier of the node passed as 109 * argument. If a node set is passed as argument, the public identifier of 110 * the first node in the set is returned. 111 * 112 * Xalan does not currently record this value, and will return null. 113 * 114 * @param nodeList a <code>NodeList</code> value 115 * @return a <code>String</code> value 116 */ 117 public static String publicId(NodeList nodeList) 118 { 119 if (nodeList == null || nodeList.getLength() == 0) 120 return null; 121 122 Node node = nodeList.item(0); 123 int nodeHandler = ((DTMNodeProxy)node).getDTMNodeNumber(); 124 SourceLocator locator = ((DTMNodeProxy)node).getDTM() 125 .getSourceLocatorFor(nodeHandler); 126 127 if (locator != null) 128 return locator.getPublicId(); 129 else 130 return null; 131 } 132 133 /** 134 * <code>lineNumber</code> returns the line number of the current 135 * context node. 136 * 137 * NOTE: Xalan does not normally record location information for each node. 138 * To obtain it, you must set the custom TrAX attribute 139 * "http://xml.apache.org/xalan/features/source_location" 140 * true in the TransformerFactory before generating the Transformer and executing 141 * the stylesheet. Storage cost per node will be noticably increased in this mode. 142 * 143 * @param context an <code>ExpressionContext</code> value 144 * @return an <code>int</code> value. This may be -1 to indicate that the 145 * line number is not known. 146 */ 147 public static int lineNumber(ExpressionContext context) 148 { 149 Node contextNode = context.getContextNode(); 150 int nodeHandler = ((DTMNodeProxy)contextNode).getDTMNodeNumber(); 151 SourceLocator locator = ((DTMNodeProxy)contextNode).getDTM() 152 .getSourceLocatorFor(nodeHandler); 153 154 if (locator != null) 155 return locator.getLineNumber(); 156 else 157 return -1; 158 } 159 160 /** 161 * <code>lineNumber</code> returns the line number of the node 162 * passed as argument. If a node set is passed as argument, the line 163 * number of the first node in the set is returned. 164 * 165 * NOTE: Xalan does not normally record location information for each node. 166 * To obtain it, you must set the custom TrAX attribute 167 * "http://xml.apache.org/xalan/features/source_location" 168 * true in the TransformerFactory before generating the Transformer and executing 169 * the stylesheet. Storage cost per node will be noticably increased in this mode. 170 * 171 * @param nodeList a <code>NodeList</code> value 172 * @return an <code>int</code> value. This may be -1 to indicate that the 173 * line number is not known. 174 */ 175 public static int lineNumber(NodeList nodeList) 176 { 177 if (nodeList == null || nodeList.getLength() == 0) 178 return -1; 179 180 Node node = nodeList.item(0); 181 int nodeHandler = ((DTMNodeProxy)node).getDTMNodeNumber(); 182 SourceLocator locator = ((DTMNodeProxy)node).getDTM() 183 .getSourceLocatorFor(nodeHandler); 184 185 if (locator != null) 186 return locator.getLineNumber(); 187 else 188 return -1; 189 } 190 191 /** 192 * <code>columnNumber</code> returns the column number of the 193 * current context node. 194 * 195 * NOTE: Xalan does not normally record location information for each node. 196 * To obtain it, you must set the custom TrAX attribute 197 * "http://xml.apache.org/xalan/features/source_location" 198 * true in the TransformerFactory before generating the Transformer and executing 199 * the stylesheet. Storage cost per node will be noticably increased in this mode. 200 * 201 * @param context an <code>ExpressionContext</code> value 202 * @return an <code>int</code> value. This may be -1 to indicate that the 203 * column number is not known. 204 */ 205 public static int columnNumber(ExpressionContext context) 206 { 207 Node contextNode = context.getContextNode(); 208 int nodeHandler = ((DTMNodeProxy)contextNode).getDTMNodeNumber(); 209 SourceLocator locator = ((DTMNodeProxy)contextNode).getDTM() 210 .getSourceLocatorFor(nodeHandler); 211 212 if (locator != null) 213 return locator.getColumnNumber(); 214 else 215 return -1; 216 } 217 218 /** 219 * <code>columnNumber</code> returns the column number of the node 220 * passed as argument. If a node set is passed as argument, the line 221 * number of the first node in the set is returned. 222 * 223 * NOTE: Xalan does not normally record location information for each node. 224 * To obtain it, you must set the custom TrAX attribute 225 * "http://xml.apache.org/xalan/features/source_location" 226 * true in the TransformerFactory before generating the Transformer and executing 227 * the stylesheet. Storage cost per node will be noticably increased in this mode. 228 * 229 * @param nodeList a <code>NodeList</code> value 230 * @return an <code>int</code> value. This may be -1 to indicate that the 231 * column number is not known. 232 */ 233 public static int columnNumber(NodeList nodeList) 234 { 235 if (nodeList == null || nodeList.getLength() == 0) 236 return -1; 237 238 Node node = nodeList.item(0); 239 int nodeHandler = ((DTMNodeProxy)node).getDTMNodeNumber(); 240 SourceLocator locator = ((DTMNodeProxy)node).getDTM() 241 .getSourceLocatorFor(nodeHandler); 242 243 if (locator != null) 244 return locator.getColumnNumber(); 245 else 246 return -1; 247 } 248 }