/**************************************************************
 * 
 * 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.
 * 
 *************************************************************/


#ifndef __com_sun_star_xml_sax_XAttributeList_idl__ 
#define __com_sun_star_xml_sax_XAttributeList_idl__ 
 
#ifndef __com_sun_star_uno_XInterface_idl__ 
#include <com/sun/star/uno/XInterface.idl> 
#endif 
 
//============================================================================= 
 
module com {  module sun {  module star {  module xml {  module sax {  
 
//============================================================================= 
 
/** specifies an element's attributes. 
	
	<p>This interface describes a name-type-value triple which describes a 
	single attribute of a tag. Implementors are encouraged to implement the 
	<type scope="com::sun::star::util">XCloneable</type> interface also to 
	allow the user to make a copy of the instance.
	
	</p>
	<p>This interface is an IDL version of the Java interface
	<em>org.xml.sax.AttributeList</em>.</p>
 */
published interface XAttributeList: com::sun::star::uno::XInterface
{ 
	//------------------------------------------------------------------------- 
	 
	/** @returns  
					the number of attributes in this list.
	 */
	short getLength(); 
 
	//------------------------------------------------------------------------- 
	 
	/** @returns  
					the name of an attribute in this list (by position).
	 */
	string getNameByIndex( [in] short i ); 
 
	//------------------------------------------------------------------------- 
	 
	/** @returns  
					the type of an attribute in the list (by position). 
					Non-validating parsers may return CDATA only.
	 */
	string getTypeByIndex( [in] short i ); 
 
	//------------------------------------------------------------------------- 
	 
	/** @returns  
					the type of an attribute in the list (by name). 
					Non-validating parsers may return CDATA only.
	 */
	string getTypeByName( [in] string aName ); 
 
	//------------------------------------------------------------------------- 
	 
	/** @returns  
					the value of an attribute in the list (by position).
	 */
	string getValueByIndex( [in] short i ); 
 
	//------------------------------------------------------------------------- 
	 
	/** @returns  
					the value of an attribute in the list (by name).
	 */
	string getValueByName( [in] string aName ); 
}; 
 
//============================================================================= 
 
}; }; }; }; };  
 
#endif 
