{
  void doApply(Stylesheet stylesheet, QName mode,               Node context, int pos, int len,               Node parent, Node nextSibling)    throws TransformerException  {    Document doc = (parent instanceof Document) ? (Document) parent :      parent.getOwnerDocument();    // Create a document fragment to hold the name    DocumentFragment fragment = doc.createDocumentFragment();    // Apply name to the fragment    name.apply(stylesheet, mode,               context, pos, len,               fragment, null);    // Use XPath string-value of fragment    String nameValue = Expr.stringValue(fragment);      String namespaceValue = null;    if (namespace != null)      {          // Create a document fragment to hold the namespace        fragment = doc.createDocumentFragment();        // Apply namespace to the fragment        namespace.apply(stylesheet, mode,                        context, pos, len,                        fragment, null);        // Use XPath string-value of fragment        namespaceValue = Expr.stringValue(fragment);        if (namespaceValue.length() == 0)          {            namespaceValue = null;          }      }        String prefix = getPrefix(nameValue);    if (namespaceValue == null)      {        if (prefix != null)          {            if (XMLConstants.XML_NS_PREFIX.equals(prefix))              {                namespaceValue = XMLConstants.XML_NS_URI;              }            else              {                // Resolve namespace for this prefix                namespaceValue = source.lookupNamespaceURI(prefix);              }          }      }    else      {        if (prefix != null)          {            String ns2 = source.lookupNamespaceURI(prefix);            if (ns2 != null && !ns2.equals(namespaceValue))              {                // prefix clashes, reset it                prefix = null;                int ci = nameValue.indexOf(':');                nameValue = nameValue.substring(ci + 1);              }          }      }    if (prefix == null)      {        // Resolve prefix for this namespace        prefix = source.lookupPrefix(namespaceValue);        if (prefix != null)          {            nameValue = prefix + ":" + nameValue;          }        else          {            if (namespaceValue != null)              {                // Must invent a prefix                prefix = inventPrefix(parent);                nameValue = prefix + ":" + nameValue;              }          }      }    NamedNodeMap attrs = parent.getAttributes();    boolean insert = true;    if (XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(namespaceValue) ||        XMLConstants.XMLNS_ATTRIBUTE.equals(nameValue) ||        nameValue.startsWith("xmlns:"))      {        // Namespace declaration, do not output        insert = false;      }    if (prefix != null && namespaceValue == null)      {        // Not a QName        insert = false;      }    if (parent.getNodeType() == Node.ELEMENT_NODE &&        parent.getFirstChild() != null)      {        // XSLT 7.1.3 Adding an attribute to an element after children have        // been added to it is an error        insert = false;      }    if (insert)      {        // Insert attribute        Attr attr = (namespaceValue != null) ?          doc.createAttributeNS(namespaceValue, nameValue) :              doc.createAttribute(nameValue);        if (attrs != null)          {            if (namespace != null)              {                attrs.setNamedItemNS(attr);              }            else              {                attrs.setNamedItem(attr);              }          }        if (children != null)          {            children.apply(stylesheet, mode,                           context, pos, len,                           attr, null);          }      }    if (next != null)      {        next.apply(stylesheet, mode,                   context, pos, len,                   parent, nextSibling);      }  }