code: func NSUnmarshalElement(ctx NSContext, el *etree.Element, v interface{}) error {
  	detatched, err := NSDetatch(ctx, el)
  	if err != nil {
  		return err
  	}
  
  	doc := etree.NewDocument()
  	doc.AddChild(detatched)
  	data, err := doc.WriteToBytes()
  	if err != nil {
  		return err
  	}
  
  	err = xml.Unmarshal(data, v)
  	if err != nil {
  		return err
  	}
  
  	switch v := v.(type) {
  	case ElementKeeper:
  		v.SetUnderlyingElement(el)
  	}
  
  	return nil
  }
docs: // NSUnmarshalElement unmarshals the passed etree Element into the value pointed to by
  // v using encoding/xml in the context of the passed NSContext. If v implements
  // ElementKeeper, SetUnderlyingElement will be called on v with a reference to el.