GetAttributeValueAt(aNode, i, v);
GetAttributeValueAt(aNode, i, v, sco);
HTMLContentSink::OpenForm(const nsIParserNode& aNode){  mCurrentContext->FlushText();  SINK_TRACE_NODE(SINK_TRACE_CALLS,                  "HTMLContentSink::OpenForm", aNode);  // Close out previous form if it's there  NS_IF_RELEASE(mCurrentForm);  // Create new form  nsAutoString tmp("FORM");  nsIAtom* atom = NS_NewAtom(tmp);  if (nsnull == atom) {    return NS_ERROR_OUT_OF_MEMORY;  }  nsresult rv = NS_NewHTMLForm(&mCurrentForm, atom);  NS_RELEASE(atom);  if (NS_OK == rv) {    // XXX replace with AddAttributes when form's implement nsIHTMLContent    // Add tag attributes to the form; we can't use AddAttributes    // because mCurrentForm is not an nsIHTMLContent (yet).    nsAutoString k, v;    PRInt32 ac = aNode.GetAttributeCount();    for (PRInt32 i = 0; i < ac; i++) {      // Get upper-cased key      const nsString& key = aNode.GetKeyAt(i);      k.SetLength(0);      k.Append(key);      k.ToUpperCase();      // Get value and remove mandatory quotes      GetAttributeValueAt(aNode, i, v);      mCurrentForm->SetAttribute(k, v);    }    // XXX Temporary code till forms become real content    // Add the form to the document    ((nsHTMLDocument*)mDocument)->AddForm(mCurrentForm);    nsIContent *content;    if (NS_OK == mCurrentForm->QueryInterface(kIContentIID, (void **)&content)) {      content->SetDocument(mDocument);      NS_RELEASE(content);    }  }  return NS_OK;}