
// DO NOT EDIT THIS FILE - it is machine generated -*- c++ -*-

#ifndef __gnu_xml_transform_ParameterNode__
#define __gnu_xml_transform_ParameterNode__

#pragma interface

#include <gnu/xml/transform/TemplateNode.h>
extern "Java"
{
  namespace gnu
  {
    namespace xml
    {
      namespace transform
      {
          class ParameterNode;
          class Stylesheet;
          class TemplateNode;
      }
      namespace xpath
      {
          class Expr;
      }
    }
  }
  namespace javax
  {
    namespace xml
    {
      namespace namespace$
      {
          class QName;
      }
    }
  }
  namespace org
  {
    namespace w3c
    {
      namespace dom
      {
          class Node;
      }
    }
  }
}

class gnu::xml::transform::ParameterNode : public ::gnu::xml::transform::TemplateNode
{

public: // actually package-private
  ParameterNode(::javax::xml::namespace$::QName *, ::gnu::xml::xpath::Expr *, jint);
  ::gnu::xml::transform::ParameterNode * ParameterNode$clone(::gnu::xml::transform::Stylesheet *);
  void doApply(::gnu::xml::transform::Stylesheet *, ::javax::xml::namespace$::QName *, ::org::w3c::dom::Node *, jint, jint, ::org::w3c::dom::Node *, ::org::w3c::dom::Node *);
  ::java::lang::Object * getValue(::gnu::xml::transform::Stylesheet *, ::javax::xml::namespace$::QName *, ::org::w3c::dom::Node *, jint, jint);
public:
  jboolean references(::javax::xml::namespace$::QName *);
  jint ParameterNode$compareTo(::gnu::xml::transform::ParameterNode *);
  ::java::lang::String * toString();
public: // actually package-private
  ::gnu::xml::transform::TemplateNode * clone(::gnu::xml::transform::Stylesheet *);
public:
  jint compareTo(::java::lang::Object *);
public: // actually package-private
  ::javax::xml::namespace$::QName * __attribute__((aligned(__alignof__( ::gnu::xml::transform::TemplateNode)))) name;
  ::gnu::xml::xpath::Expr * select;
  jint type;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_xml_transform_ParameterNode__
